Go学习笔记三(数据类型)

数组和切⽚

数组的声明

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是元素,如此能遍历数组能同时得到索引和元素,打印结果如下图


Go学习笔记三(数据类型)_第1张图片
打印结果

数组截取

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. 切⽚

  1. 容量是否可伸缩 (切片可伸缩
  2. 是否可以进⾏比较(数组可比较

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可以实现工厂模式,会有单独文章介绍。

你可能感兴趣的:(Go学习笔记三(数据类型))