array数组
在Go中,数组是一个特定长度的有编号的元素序列,下面的示例中创建了一个数组a,它可以容纳5个int类型的值。元素的类型和长度是数组类型的两个组成部分。
默认情况下,数组是零值的,即数组所有元素都是其类型相应的零值,对于int意味着0。使用语法array[index]=value给指定索引的元素赋值,使用array[index]获取指定元素的值。内置函数len返回数组的长度。
数组在声明时可以初始化,初始值在大括号中,元素值用逗号分隔。数组类型是一维的,但是可以组合以构建多维数据结构。请注意,当使用fmt.Println打印时,数组以[v1 v2 v3…]的形式出现。
结果:
$ go run arrays.go
emp: [0 0 0 0 0]
set: [0 0 0 0 100]
get: 100
len: 5
dcl: [1 2 3 4 5]
2d: [[0 1 2] [1 2 3]]
slice切片
切片是Go中重要的数据类型,它为元素序列提供了比数组更强大的接口。与数组不同,切片的类型只由它们所包含的元素(而不是元素的数量)决定。创建长度非零的空切片,要使用内置make函数。下面的示例中生成一个长度为3(初始值为零)的字符串切片。
可以像使用数组那样进行设置和获取元素值。内置函数len返回切片的长度。
除了这些基本操作之外,slices还支持更多的操作实现比数组更丰富的接口。比如,内置函数append向切片末尾添加新的元素。注意,需要接受append的返回值,因为如果切片容量不足够容纳新元素时可能会产生一个容量更大的新的切片。
切片可以被复制,创建一个与切片s长度相同的空切片c,使用内置函数copy把元素从s复制到c。
切片支持“切”操作符,语法为name[low:high]。切取的元素由low到high(不包括high),省略low时从头切取,省略high时切取到末尾。
可以在同一行中声明和初始化切片变量。切片也可以组成多维数据结构。切片内部的长度可以变化,这与多维数组不同。请注意,虽然切片的类型不同于数组,它们由fmt.Println打印出的形式一样。
结果:
$ go run slices.go
emp: [ ]
set: [a b c]
get: c
len: 3
apd: [a b c d e f]
cpy: [a b c d e f]
sl1: [c d e]
sl2: [a b c d e]
sl3: [c d e f]
dcl: [g h i]
2d: [[0] [1 2] [2 3 4]]
map映射
映射是Go的内置关联数据类型(其他语言中也称为hash散列或dict字典)。
创建空映射,使用内置函数make(map[key type]val type)。也可以在同一行中声明并初始化一个新的映射。内置函数len返回映射的键/值对的数目。内置函数delete从映射中删除键/值对。
使用经典语法形式name[key]=val来设置键/值对。语法name[key]获取指定键的值,第一个返回值是元素值,可选的第二个返回值指示该键是否存在于映射中。这可用于检测键是否存在,区别了与0或“”等零值键之间的歧义。不需要的值可以用下划线忽略掉。
使用fmt.Println打印映射时,将显示其所有键/值对。注意,当用fmt.Println打印时,映射的格式为[k:v k:v]。
结果:
$ go run maps.go
map: map[k1:7 k2:13]
v1: 7
len: 2
map: map[k1:7]
prs: false
map: map[bar:2 foo:1]
range范围
范围用于迭代各种数据结构中的元素。
下面的示例中使用range来对切片中的数字求和。数组的工作方式也与此类似。range用在数组和切片上时,返回每个元素的索引和值。不需要索引时,可以用空白标识符_忽略它;需要索引时则可以用变量接受它。
range用在映射上时,对键/值对进行迭代遍历。也可以对映射的键单独进行迭代。
range用在字符串上时,是对Unicode码迭代。第一个值是rune的起始字节索引,第二个值是rune本身。
结果:
$ go run range.go
sum: 9
index: 1
a -> apple
b -> banana
key: a
key: b
0 103
1 111