Go语言中的复合类型详细介绍

2019-11-10 08:59:21于海丽

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):