一、总结

Golang Array和以往认知的数组有很大不同。


  1. 数组:是同一种数据类型的固定长度的序列。
  2. 数组定义:var a [len]int,比如:var a [5]int,数组长度必须是常量,且是类型的组成部分。一旦定义,长度不能变。
  3. 长度是数组类型的一部分,因此,var a[5] int和var a[10]int是不同的类型。
  4. 数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1
  5. 访问越界,如果下标在数组合法范围之外,则触发访问越界,会panic
  6. 数组是值类型,赋值和传参会复制整个数组,而不是指针。因此改变副本的值,不会改变本身的值。
  7. 支持 “==”、”!=” 操作符,因为内存总是被初始化过的。
  8. 指针数组 [n]T(存指针类型的数组),数组指针 [n]T(数组的指针对象)。
  9. 值拷贝行为会造成性能问题,通常会建议使用 slice,或数组指针。
  10. 内置函数 len 和 cap 都返回数组长度 (元素数量)。

二、数组的介绍

1.数组初始化

1.1一维数组

  1. 全局:
  2. var arr0 [5]int = [5]int{1, 2, 3}
  3. var arr1 = [5]int{1, 2, 3, 4, 5}
  4. var arr2 = [...]int{1, 2, 3, 4, 5, 6}
  5. var str = [5]string{3: "hello world", 4: "tom"}
  6. 局部:
  7. a := [3]int{1, 2} // 未初始化元素值为 0。
  8. b := [...]int{1, 2, 3, 4} // 通过初始化值确定数组长度。
  9. c := [5]int{2: 100, 4: 200} // 使用索引号初始化元素。
  10. d := [...]struct {
  11. name string
  12. age uint8
  13. }{
  14. {"user1", 10}, // 可省略元素类型。
  15. {"user2", 20}, // 别忘了最后一行的逗号。
  16. }

1.2多维数组

  1. 全局
  2. var arr0 [5][3]int
  3. var arr1 [2][3]int = [...][3]int{{1, 2, 3}, {7, 8, 9}}
  4. 局部:
  5. a := [2][3]int{{1, 2, 3}, {4, 5, 6}}
  6. b := [...][2]int{{1, 1}, {2, 2}, {3, 3}} // 第 2 纬度不能用 "..."。