golang 数组 array, 切片, slice Go 的切片类型为处理同类型数据序列提供一个方便而高效的方式。 切片有些类似于其他语言中的数组, 但是有一些不同寻常的特性。
Go的(Slice)切片是在(Array)数组之上的抽象数据类型, 因此在了解切片之前必须要先理解数组。
数组, array 声明一个数组
// var identifier [len]type var foo [5]int // 声明时没有指定数组的初始化值, 因此所有的元素都会被自动初始化为默认值 0。 //Go 语言中的数组是值类型,因此还可以用 new 来创建 bar := new([5]int) // new 返回类型的指针,因此 foo bar 的区别在于: foo 的类型为 [5]int,bar 的类型为 *[5]int。 var a [4]int a[0] = 1 i := a[0] 数组的长度在声明它的时候就必须给定,并且之后不会再改变。可以说, 数组的长度是其类型的一部分。比如, [1]string 和 [2]string 就是两个不同的数组类型。 数组可以以常规的索引方式访问,表达式 s[n] 访问数组的第 n 个元素。
golang array 特点:
golang中的数组是值类型, 也就是说, 如果你将一个数组赋值给另外一个数组, 那么, 实际上就是整个数组拷贝了一份 如果 golang 中的数组作为函数的参数, 那么实际传递的参数是一份数组的拷贝, 而不是数组的指针 array 的长度也是 Type 的一部分, 这样就说明 [10]int 和 [20]int 是不一样的。 foo:= [5] int {1,2,3,4,5} // 长度为5的数组,其元素值依次为: 1,2,3,4,5 [5] int {1,2} // 长度为5的数组,其元素值依次为: 1,2,0,0,0 。在初始化时没有指定初值的元素将会赋值为其元素类型int的默认值0,string的默认值是"" [...] int {1,2,3,4,5} // 长度为5的数组,其长度是根据初始化时指定的元素个数决定的 [5] int { 2:1,3:2,4:3} // 长度为5的数组,key:value,其元素值依次为: 0,0,1,2,3。在初始化时指定了2,3,4索引中对应的值: 1,2,3 [...] int {2:1,4:3} // 长度为5的数组,起元素值依次为: 0,0,1,0,3。由于指定了最大索引4对应的值3,根据初始化的元素个数确定其长度为5 // 遍历 for i, value := range arrayOrSlice { log.Printf("%v: %v", i, value) } 切片/Slices slice 切片类型是一个引用类型, 是一个动态的指向数组切片的指针。 slice 是一个不定长的, 总是指向底层的数组 array 的数据结构。
...