数组和切⽚
数组的声明
var a [3]int //声明并初始化为默认零值
a[0] = 1
b := [3]int{1, 2, 3} //声明同时初始化
c := [...]int{1, 2, 3} //不指定元素个数
d := [2][2]int{{1, 2}, {3, 4}} //多维数组初始化
数组元素遍历
与其他主要编程语⾔言的差异
func TestTravelArray(t *testing.T) {
a := [...]int{1, 2, 3, 4, 5} //不指定元素个数
for idx/*索引*/, elem/*元素*/ := range a {
fmt.Println(idx, elem)
}
}
idx是索引,elem是元素,如此能遍历数组能同时得到索引和元素,打印结果如下图
数组截取
a[开始索引(包含), 结束索引(不包含)]
a := [...]int{1, 2, 3, 4, 5}
a[1:2] //2
a[1:3] //2,3
a[1:len(a)] //2,3,4,5
a[1:] //2,3,4,5
a[:3] //1,2,3
另外,go语言中数组可以直接比较。
切⽚声明
var s0 []int
s0 = append(s0, 1)
s := []int{}
s1 := []int{1, 2, 3}
s2 := make([]int, 2, 4)
/*[]type, len, cap 其中len个元素会被初始化为默认零值,未初始化元素不不可以访问
*/
切片内部结构和切片共享存储结构将会有单独的文章记录心得,此文章暂不提及。
切片和数组最大的区别在于申明的时候,切片没有指定长度,而数组会指定长度。
数组 vs. 切⽚
- 容量是否可伸缩 (切片可伸缩)
- 是否可以进⾏比较(数组可比较)
Map
Map 声明
m := map[string]int{"one": 1, "two": 2, "three": 3}
m1 := map[string]int{}
m1["one"] = 1
m2 := make(map[string]int, 10 /*Initial Capacity*/)
Map 元素的访问
与其他主要编程语言的差异
在访问的 Key 不存在时,仍会返回零值,不能通过返回 nil 来判断元素是否存在。应如此判断:
if v, ok := m["four"]; ok {
t.Log("four", v)
} else {
t.Log("Not existing")
}
Map 遍历
m := map[string]int{"one": 1, "two": 2, "three": 3}
for k, v := range m {
t.Log(k, v)
}
map可以实现工厂模式,会有单独文章介绍。