golang复合类型包括:结构体、数组、切片、Maps。
1、数组
数组
golang中的数组与C语言中的数组差异很大,倒更类似Pascal中的数组。 (Slice,下个话题,有些像C语言中的数组)
var ar [3]int
声明ar为一个拥有三个整型数的数组,所有元素初始化为0。
大小是类型的一个组成部分。
内置的函数len可以用于获取数组大小:
len(ar) = 3
数组是值类型
golang中的数组是值,而非C语言中的隐式指针。你可以获得数组的地址,并生成一个指向数组的指针(例如,将其高效地传递给函数):
func f(a [3]int) { fmt.Println(a) }
func fp(a *[3]int) { fmt.Println(a) }
func main() {
var ar [3] int
f(ar) // 传递一个ar的拷贝
fp(&ar) // 传递一个指向ar的指针
}
输出结果:
[0 0 0]
&[0 0 0]
数组字面值
所有的符合类型都有相同的值创建语法。以数组为例,其语法如下:
3个整数的数组:
[3]int{1, 2, 3}
10个整数的数组,前三个元素不是0:
[10]int{ 1, 2, 3}
不想数?使用…代表长度:
[...]int{1, 2, 3}
不想初始化所有值?使用key:value对:
[10]int{2:1, 3:1, 5:1, 7:1}
指向数组字面值的指针
你可以获取数组字面值的地址,这样可以得到一个指向新建数组实例的指针:
func fp(a *[3]int) { fmt.Println(a) }
func main() {
for i := 0; i < 3; i++ {
fp(&[3]int{i, i*i, i*i*i})
}
}
输出结果:
&[0 0 0]
&[1 1 1]
&[2 4 8]
2、切片(Slice)
切片
切片是对数组中某一段的引用。
切片比普通数组应用得更多也更广泛。
切片使用的代价很低。
一个切片类型很像一个没有大小的数组类型:
var a []int
内置的len(a)可以返回切片中元素的个数。
通过对数组或切片进行"切片",我们可以创建一个新切片:
a = ar[7:9]
a(上面例子中的a)的有效下标值是0和1;len(a) == 2。
切片速记
当对数组进行切片时,第一个下标值默认是0:
ar[:n]等价于a[0:n]。
第二个下标值默认为len(array/slice):










