Go语言学习(二):array、slices和map
前言
数组array
// e.g: [32]byte // 长度32的数组,每个元素为1个byte [16]*float64 // 指针数组 [3][5]int // 二维数组
// e.g package main import "fmt" func modify(array [5]int) { array[0] = 10 fmt.Println("In modify(), array values:", array[0]) } func main() { array := [5]int{1, 2, 3, 4, 5} modify(array) fmt.Println("In main(), array values:", array[0]) }
数组切片slices
- 一个指向原生数组的指针,即在底层仍旧开辟一个数组,数组切片结构中含有指向该数组的指针;
- 数组切片中的元素个数;
- 数组切片已分配的存储空间;
数组切片创建
- 基于数组
// e.g var myArray [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} var mySlice []int = myArray[:5] // Go语言支持用myArray[first:last]格式选择数组元素
- 直接创建
// e.g mySlice1 := make([]int, 5) // 创建元素个数为5的数组切片,默认初始化为0 mySlice2 := make([]int, 5, 10) // 同上,但总共预留的是10个元素的存储空间 mySlice3 := []int{1, 2, 3, 4, 5} // 直接创建并初始化包含5个元素的数组切片
- 基于切片
// e.g oldSlice := []int{1, 2, 3, 4, 5} newSlice := oldSlice[:3] // 基于oldSlice的前3个元素构建新数组切片类似于数组切片基于数组创建,与基于数组创建区别就是:基于旧有切片创建的新数组切面可以超过所包含的元素个数,超出元素部分初始化为0,但有一个限制就是不得超过旧有切片的存储空间。
动态增减元素
数组切片支持Go语言内置的cap()和len()函数,cap()返回数组切片分配空间值,len()返回切片中存储的元素个数。
// e.g mySlice = append(mySlice, 1, 2, 3) // 添加普通元素 mySlice = append(mySlice, mySlice1...) // 添加一个切片,注意后面“...”一定不能省略数组切片会自动处理存储空间不足的问题。如果追加的内容长度超过当前已分配的存储空间,数组切片会自动分配一块足够大的内存。这也是之前说到要合理设置存储空间值的原因。
// e.g slice1 := []int{1, 2, 3, 4, 5} slice2 := []int{5, 4, 3} copy(slice2, slice1) // 复制slice1的前三个元素到slice2中 copy(slice1, slice2) // 复制slice2的3个元素到slice2的前3个位置
键值对map
- 变量声明
// e.g var myMap map[string] PersonInfo其中,myMap是声明的map变量名,string是?类型,PersonInfo则是其存放的值类型。
依旧使用内置函数make()来创建一个map。
// e.g myMap = make(map[string] PersonInfo, 100)或者直接创建并初始化map的代码如下:
// e.g myMap = map[string] PersonInfo { "1234": PersonInfo{"1", "Jack", "Room 101, ..."} }
- 添加:
// e.g myMap["456"] = PersonInfo{"2", "Bob", "Room 102, ..."}
- 删除:
- 查找:
// e.g value, ok := myMap["1234"] if ok { // 找到了, 处理... }这几行代码表示只需查看第二个返回值ok即可,非常简单了。。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。