Go语言读书笔记:数组和切片

数组

声明数组

要创建数组 ,先声明一个数组变量,并指定其长度和数据类型。

var fruits [2]string

声明后,便可对数组赋值。

fruits[0] = "apple"
fruits[1] = "banana"

也可以直接声明并赋值。

var fruits = [2]string{"apple","banana"}
// or
fruits := [2]string{"apple","banana"}  

如果数组长度不确定,可以使用 代替数组的长度,编译器会根据元素个数自行推断数组的长度:

var fruits = [...]string{"apple","banana"}
// or
fruits := [...]string{"apple","banana"}  //根据字段个数

如果设置了数组的长度,我们还可以通过指定下标来初始化元素:

//  将索引为 1 和 3 的元素初始化
number := [5]float32{1:2.0 , 3:7.0}

初始化数组中 {} 中的元素个数不能大于 [] 中的数字。

切片

使用数组存在一定的局限性,比如数组是定长的,无法在数组中添加元素,使用切片可以添加和删除元素,还可以复制切片中的元素。可以将切片视为轻量级的数组包装器。

声明切片

切片不需要说明长度,创建默认长度为2的空切片

var fruits = make([]string, 2)

也可以直接声明并赋值。

var fruits = []string{"apple","banana"}
// or
fruits := []string{"apple","banana"}

添加元素

在切片中添加元素,append会自动调整切片的长度

fruits = append(fruits,"orange")

函数append是一个不定参数函数,可以在里面添加任意个数的值。

删除元素

在切片中删除元素,也可以使用append,例如删除索引为2的元素。

fruits = append(fruits[:2] ,fruits[2+1:]...)

复制元素

要复制切片的全部或部分元素,可使用函数 copy。在复制元素前,必须声明一个类型与原切片相同的切片。例如,只复制切片的部分元素到新切片。

copy(newfruits,fruits[1:])

映射

数组和切片是可以通过索引值访问的元素集合,而映射是通过键来访问的无序元素编组。类似于其他编程语言中的关联数组、字典或散列。简单地说,映射就是键值对集合。

声明映射

var fruits = make(map[string]int)

通过make函数创建一个映射,其中键的类型为字符串,值的类型为整数。

添加键值对

fruits["apple"] = 10
fruits["banana"] = 20

可直接在映射中动态地添加元素 ,而无须调整映射的长度。

删除元素

使用delete删除映射中的元素,将键作为参数传递给delete。

delete(fruits,"apple")

总结

  1. 使用数组还是切片?

    答: 除非确定必须使用数组,否则请使用切片,切片能够随意添加和删除元素,还无须处理内存分配问题。

  2. 没有从切片中删除元素的内置函数吗?

    答:不能将 delete 用于切片 没有专门用于从切片中删除元素的函数,但可使用内append 来完成这种任务,您还可创建子切片

  3. 需要指定映射的长度吗?

    答:不需要。使用内置函数 make 创建映射时,可使用第二个可选参数,但这个参数只是容量提示,而非硬性规定。映射可根据要存储的元素数量自动增大,因此没有必要指定长度。