Go 中提供 slice 类型,用于访问数组中的元素。slice 类型为 []T,T 为其访问的元素的类型。slice 类型变量通过 arr[ low : high ] 的方式定义,其中 arr 为对应的数组,low 和 high 分别表示数组中索引,slice 类型可以访问数组中 [ low : high ) 范围的变量。当 low 被省略时,默认视为 0,high 被省略时,默认为数组长度。slice 类型可以看作对于数组中元素的引用,通过 slice 对元素的修改会对应修改数组中对应的元素。
// 数组
var arr [5]int = { 1, 2, 3, 4, 5 }
//slice
var a []int = arr[1:3] // a[0]=2, a[1]=3 两个元素
a[0:5] // 均可索引整个数组
b := []int{ 1, 2, 3 } // 定义数组,并建立了对应的 slice b
slice 类型变量包含有长度(length)和容量(capacity)两个信息,其中 length 表示 slice 类型可以访问的元素的个数,capacity 表示 slice 对应的数组从 slice 开始位置到数组结束位置的长度。可通过 len(a) 和 cap(a) 的方式查看 slice 的这两个属性。slice 未被初始化时,其默认值为 nil,length 与 capacity 属性均为 0,没有数组与之对应。
a := []int{ 1, 2, 3, 4, 5, 6 }
a[ : 0 ] // len = 0, cap = 6
a[ : 4 ] // len = 4, cap = 6
a[ 2 : ] // len = 2, cap = 4
slice 变量还可以通过 Go 中内置的 make 函数进行创建,make 函数的使用形式为 make( T, args ) 。其中 T 为构建的类型,后接构建的参数。
a := make( []int, 4 ) // 构建一个长度为 4 的数组的 slice,数组元素默认为 0
b := make( []int, 3, 5 ) // 构建一个长度为 5 的数组的 slice,索引的slice 的 length 为 3
slice 变量可以通过内置的 append 函数进行扩充。 append 函数签名为 func append( s []T, vs ... T ) []T,其中第一个参数为进行 append 操作的 slice 变量,后面为具体进行 append 的元素。append 支持逐元素的添加,也支持添加另一个 slice.当进行 append 操作的 slice 所对应的底层数组 capacity 足够时,append 操作对应会修改底层数组的值,若 capacity 不足时,append 操作会进行数组的重新分配,并返回新的 slice 结果。
v := []int{}
v := append( v, 1 ) // 添加一个元素
v := append( v, []int{1,2,3}... ) // 添加另一个 slice 中的元素,此时 append 的 slice 后需要加上 '...'
在 for 循环中,可以使用 range 关键字来简化对 slice 元素的遍历操作,每次循环过程中,range 会返回两个值,第一个为元素对应 slice 中的 index,第二个为 slice 在该 index 位置的值的拷贝。若不需要使用 range 返回的值的内容,可以使用 "_" 来忽略。同时,在 range 用法中,若只需要使用 slice 的索引,则可以省略第二个参数,直接使用 i := range a 即可。
a := []int{ 1, 2, 3, 4, 5 }
for index, _ := range a {
// statements
for i := range a { // 若只是用索引,则可以直接省略第二个参数
// statements
更多关于 slice 介绍可以参考 Go Slices: usage and internals 。
Go 中提供 map 来建立 key 与 value 之间的关系。map 变量的默认值为 nil,无法进行任何操作。用户可以通过赋值或 make 函数获取可操作的 map。
var m map[int]int // m 为 nil,无法进行操作
m := map[int]int{} // m 为空的 map,可以进行操作
m := make( map[int]int )
m := make[int]int{ 1:2, 3:4 } // m 为一个 int 到 int 的 map
map 可支持的操作如下所示:
a := map[int]int{} // 获取一个空的 map 变量 a
a[ 1 ] = 3 // 添加/修改 key / value 关系
b = a[ 1 ] // 返回 key 对应的 value 值,若对应的 key 不存在,直接返回对应类型的默认零值(注意不存在对应元素时不会自动创建,与 C++ map 不同)
a[1] ++ // 更新 key = 1 所对应的 value 值,若 key = 1 不存在,则会创建一个值为 0 的映射并继续操作
delete( a, 1 ) // 删除 map 中的 key
value, ok := a[3] // 测试 map 中是否含有对应的 key,若存在,则 ok 为 true,否则为 false,对应的 value 中包含有 key 对应的 value 或对应类型的初始零值