Go 语言之 slice

Go语言中的slice(切片)类型,我的理解是“可变长度数组”
切片是引用类型
切片是引用类型,这意味着如果你将一个切片赋值给另外一个切片,这两个切片将
引用同一个底层数组。这与传递一个指向底层数组的指针相类似。

创建切片可用以下两种方法:

直接创建:
s := make([]int, 10)
创建了名为s 的,有10个元素(长度等于10)的整数类型切片

s := []int{1,2,3,4,5}
创建了名为s 有5个元素的整数类型切片,并为每个元素赋值分别为1,2,3,4,5

间接建立:
先建数组a 再用数组创建切片s
var a [10]int
s := a[1:5]
创建了名为s 长度为4 容量为10 的整数类型切片,即
len(s)等于4 ,cap(s)等于10 (效果与使用make([]int, 4, 10)相似)
切片s 指向数组a[1],a[2],a[3],a[4]
当数组a 的值改变,切片s 的值也会变,因为切片s 引用数组a 
(如果多个切片指向同一个数组,当这个底层数组值改变时,指向它的多个切片的值也会变)

也可以重新指定:
s = a[0:8]   //s 指向数组 a[0]至 a[7]
s = s[2:5]   //s 指向原切片的s[2],s[3],s[4]三个元素。
             //用[x:y]时总会指向x 至 y -1 的元素
             //当x为首个元素 或y为最后一个元素时 可以省略不写

增加元素:
用append函数可增加切片的长度
s := []int{1,2,3}     //建切片s
s = append(s, 4, 5)   //当追加的是值时(可以是1个或多个)
                      //它为切片s 增加两个元素,并赋值为4 和5 
也可以为切片追加切片
a := []int{6, 7}      //建切片a
s = append(s,a...)    //当追加的是切片时后面要有三个点
                      //为切片s 追加切片a得出s 等于[1,2,3,4,5,6,7]
s = append(s[2:5],a...)  //得出s 等于[3,4,5,6,7]
当追加后的元素个数大于本切片的容量时,函数append会为
原来的切片s 重新分配空间,所以s 不会引用原来的数组或被追加的数组
若没有...就会报错误而无法工作;这是追加值与追加切片的不同

还有函数copy
copy函数用于从一个数组或切片中复制 数据到另一个切片中
n1 := copy(s, a[x:y])
把数组或切片a 复制到s 中,并反回被复制的元素个数给n1
a 可以是数组或切片,但s 只能是切片
被复制的是数组元素的 值而不是引用
被复制的元素个数为len(a[x:y]) 和len(s) 中较少的一个

例:
var a = [...]int{0, 1, 2, 3, 4, 5, 6, 7}
var s = make([]int, 6)
n1 := copy(s, a[:])         //说明:把a 全部的值 复制到s 中
n2 := copy(s, s[2:])        //说明:把指定范围的值 复制到s 的开始位置
n3 := copy(s[4:6], a[6:8])  //说明:把指定范围的值 复制到s 的指定位置

切片作为函数的参数
以切片作为参数是Go常用的做法
func myFunc(args []int) {}   //args是函数myFunc的参数,它是一个切片
以切片作为参数有很多好处:
1.传入的参数可以是一个或多个
2.如果传入的是数组或切片则传入它的引用,这与传递一个指针相类似

切片作为参数还有另一个写法:
func myFunc2(args ...int) {}
这样写有什么不同?
第一种参数写法,调用函数时要这样写:
myFunc([]int{1,2,3})
第二种参数写法时,调用函数是这样写:
myFunc2(1,2,3)
这样就方便了调用时的写法,它是一个语法糖

不管怎样操作,切片的索引总是从[0]开始。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。