zoukankan      html  css  js  c++  java
  • Go语言学习笔记十二--Go语言切片

    一、切片的概念和基本操作

     1 package main
     2 
     3 import "fmt"
     4 
     5 //切片定义 切片是基于数组类型的一层封装。它非常灵活,可以自动扩容,切片是一个引用类型
     6 func main() {
     7     var a [5]int // []内写了数字就是数组 没写数子就是切片
     8     var b []int //切片底层是基于数组类型做的一个封装 底层就是一个数组 所以数组的所有操作切片都可以用
     9     fmt.Println(a,b)
    10     //Go语言用 nil来表示是否为空
    11     if b == nil {
    12         fmt.Println("b是一个空切片")
    13     } else {
    14         fmt.Printf("b不是一个空切片 b的值为 = %v
    ", b)
    15     }
    16     //b[0] = 100 //这种写法是错误的,切片必须先初始化
    17     var c [5]int= [5]int{1,0,0,8,6}
    18     fmt.Println(" c的值为 = ", c)
    19     b = c[0:3] //这种方式是基于已有的数组,对数组做一个切片
    20     fmt.Println(" b的值为 = ", b)
    21     //我们修改切片b里面的值
    22     b[0] = 100
    23     b[1] = 199
    24     b[2] =88
    25     fmt.Println(" b的值为 = ", b)
    26     fmt.Println(" c的值为 = ", c) //发现c的值也跟着一起改变了,也再一次说明了切片是引用类型
    27     d := c[:] //定义切片d
    28     d[1] = 888 //其实修改的c数组里面下标为1的数值
    29     fmt.Println(" b的值为 = ", b)
    30     fmt.Println(" c的值为 = ", c) //发现c的值也跟着一起改变了,也再一次说明了切片是引用类型
    31     //切片初始化的第二种方式
    32     e := []int{3,2,1}
    33     fmt.Println(e)
    34 }

    二、make的使用和切片的追加、复制

     1 package main
     2 
     3 import "fmt"
     4 
     5 func main() {
     6     //注意[]中没有值 参数分别表示切片的类型,切片的长度,切片的容量
     7     //3 表示当前这个切片只有三个元素 10表示这个切片的底层是10个元素的数组 虽然arr[3]赋值会报错,但是可以通过append方法扩容
     8 
     9     arr := make([]int,3,10)
    10     arr[0] = 10
    11     arr[1] = 20
    12     arr[2] = 30
    13     arr = append(arr,11)
    14     fmt.Println(arr)
    15 
    16     fmt.Println("--------分界线---------")
    17 
    18     a := make([]int, 5, 10)
    19     a[0] = 33
    20     fmt.Printf("a里面的值为:%v, a的长度为:%d, a的容量为:%d, a的地址为%p
    ",a, len(a),cap(a),a)
    21     a = append(a,11)
    22     fmt.Printf("a里面的值为:%v, a的长度为:%d, a的容量为:%d, a的地址为%p
    ",a, len(a),cap(a),a)
    23     for i:=0;i<6;i++ {
    24         a = append(a,33)
    25         fmt.Printf("a里面的值为:%v, a的长度为:%d, a的容量为:%d, a的地址为%p
    ",a, len(a),cap(a),a)
    26     }
    27 
    28     fmt.Println("
    --------分界线---------")
    29     //定义一个空切片
    30     var b []int
    31     fmt.Printf("b:%p, len=%d, cap=%d
    ",b,len(b),cap(b))
    32     //空切片地址是空,不能进行访问或者赋值 否则会报错
    33     if b==nil {
    34         fmt.Println("这是一个空切片")
    35         //空切片可以append
    36         b = append(b, 11)
    37         fmt.Printf("b:%p, len=%d, cap=%d
    ",b,len(b),cap(b))
    38         b = append(b, 22)
    39         fmt.Printf("b:%p, len=%d, cap=%d
    ",b,len(b),cap(b))
    40         b = append(b, 33)
    41         fmt.Printf("b:%p, len=%d, cap=%d
    ",b,len(b),cap(b))
    42         b = append(b, 44)
    43         fmt.Printf("b:%p, len=%d, cap=%d
    ",b,len(b),cap(b))
    44         b = append(b, 55)
    45         fmt.Printf("b:%p, len=%d, cap=%d
    ",b,len(b),cap(b))
    46         //2倍扩容
    47     }
    48 
    49 
    50     fmt.Println("
    --------分界线---------")
    51     //切片后面追加切片
    52     c := []int{1,2,3}
    53     d := []int{4,5,6}
    54     e := append(c, d...)
    55     fmt.Println(e)
    56     e = append(e, 7,8,9)
    57     fmt.Println(e)
    58     //可以通过传切片来修改数组的值
    59     //切片的复制、拷贝
    60     //将d切片复制到c //只能copy长度前面的切片 并不会对其进行扩容
    61     fmt.Println("c的值为",c)
    62     copy(c, d)
    63     fmt.Println("c的值为",c)
    64     copy(c, e)
    65     fmt.Println("c的值为",c)//
    66 
    67 }
    68 // make 和 new 的区别
    69 //

     三、利用切片实现排序

     1 package main
     2 
     3 import (
     4     "fmt"
     5     "sort"
     6 )
     7 
     8 func main() {
     9 
    10     a := [5]int{3,5,1,2,4}
    11     fmt.Println("排序前的值为:", a)
    12     //对int进行排序 排序需要传一个切片
    13     sort.Ints(a[:])
    14     fmt.Println("排序后的值为:", a)
    15  
    16     //当然也可以对字符串进行排序
    17     strs := [5]string{"banana","apple","pear","watermelon","peach"}
    18     fmt.Println("排序前的值为:", strs)
    19     sort.Strings(strs[:])
    20     fmt.Println("排序后的值为:", strs)
    21 }
  • 相关阅读:
    MySQL查询今天/昨天/本周、上周、本月、上个月份数据的sql代码
    lumen 登陆 注册 demo
    Maven与Ant的区别
    Java中String为什么是final
    一天一点MySQL复习——获取数据库系统时间、变量赋值、变量比较
    一天一点MySQL复习——存储过程
    Mybatis学习——传递Map型参数
    Java修饰符
    RegEx正则表达式学习笔记
    一天一个Java基础——通过异常处理错误
  • 原文地址:https://www.cnblogs.com/xwxz/p/13322438.html
Copyright © 2011-2022 走看看