声明与初始化 #
数组 #
- 声明数组时必须指定长度,长度可以是常量:
var arr [5]int
- 数组不可以追加元素:
// var arr = [5]int{1, 2, 3, 4, 5}
// 数组不可以追加元素
// arr = append(arr, 6)
- 声明数组时,可以进行初始化:
var arr = [5]int{1, 2, 3, 4, 5}
- 如果声明数组时进行了初始化,也可以不指定长度,使用…来代替:
var arr = [...]int{1, 2, 3, 4, 5}
- 声明数组时,长度可以是常量
const length = 5
var arr [length]int
- 初始化数组时,可以不从第一个元素开始初始化:
// 初始化数组时,可以指定下标
var arr = [5]int{1: 1, 5, 6}
// [0 1 5 6 0]
t.Log(arr)
- 不可以使用make来初始化数组。
切片 #
- 声明切片时不用指定长度:
// 声明切片时不用指定长度
var slice0 []int
- 切片可以追加元素:
// 切片可以追加元素
slice0 = append(slice0, 10)
t.Log(slice0)
- 可以使用make来初始化切片,指定长度和容量:
// 可以使用make来初始化切片,指定长度和容量 ,长度为5,容量为10
var slice1 = make([]int, 5, 10)
t.Log(slice1)
- 可以通过截取数组来初始化切片:
// 从数组中截取
arr := [5]int{1, 2, 3, 4, 5}
// 从数组中截取
slice := arr[1:3]
// [2 3]
t.Log(slice)
// 2 4
t.Log(len(slice), cap(slice))
比较 #
数组 #
- 可以通过 “==” 来比较两个数组:
arr0 := [5]int{1, 2, 3, 4, 5}
arr1 := [5]int{1, 2, 3, 4, 5}
// true
t.Log(arr0 == arr1)
- 数组不可以和nil比较:
// 数组不可以和nil比较
// var arr = [5]int{1, 2, 3, 4, 5}
// 报错 invalid operation: arr == nil (mismatched types [5]int and untyped nil)
// t.Log(arr == nil)
切片 #
- 两个切片不可以直接用 “==“比较:
slice0 := []int{1, 2, 3, 4, 5}
slice1 := []int{1, 2, 3, 4, 5}
// 报错 invalid operation: slice0 == slice1 (slice can only be compared to nil)
// t.Log(slice0 == slice1)
- 切片可以和nil比较:
// 声明切片时不用指定长度
var slice0 []int
t.Log(slice0)
// true
t.Log(slice0 == nil)
底层数据结构 #
数组 #
数组的底层数据结构,可以参考sr/go/type/array.go:
type Array struct {
len int64
elem Type
}
切片 #
在src/runtime/slice.go中定义了切片的结构体:
type slice struct {
array unsafe.Pointer
len int
cap int
}