Go 语言中常见的容器。
数组
var name [size]T
举例:
var classMates [3]string
# or
classMates2 := [...]string{"A", "B", "C"}
切片
切片是对数组的一个连续片段的引用,容量可变的序列。动态数组。
内部结构包括底层数组指针、大小和容量。
- array 指向底层存储数组的指针
- len 切片长度
- cap 切片容量,总是大于等于 len
从原数组中生成一个切片:
slice := source[begin:end]
举例:
source := [...]int{1,2,3}
sli := source[0:1]
动态创建切片,可以通过 make
函数动态创建切片
make([]T, size, cap)
- T 是切片中的元素类型
- size 长度
- cap 预先分配的长度,容量
直接声明新的切片,不需要指定大小:
var name []T
比如:
ex := []int{1,2,3}
对切片的操作
append
append
函数可以向切片添加元素,返回新的切片。
copy
复制切片内容
copy(destSli, srcSli []T)
列表和字典
列表,链表
Go 通过双向链表实现,插入、删除非常高效。
var names list.List
name := list.New()
字典
映射关系,内部通过散列表方式实现。
name := make(map[KeyType]valueType)
package main
import "fmt"
func main() {
classMate := map[string]string{
"1": "EV",
"2": "EV2",
}
fmt.Println(classMate)
classMate1 := make(map[int]string)
classMate1[0] = "EV"
classMate1[1] = "EV1"
fmt.Println(classMate1)
mate, ok := classMate1[0]
fmt.Println(mate, ok)
}
容器遍历
通过 for-range
语法
// 数组
nums := [...]int{1, 2, 3, 4, 5, 4, 3, 2, 1}
for k, v := range nums {
fmt.Println(k, v)
}
// 切片
slis := []int{1, 2, 3, 4, 5, 4, 3, 2, 1}
for k, v := range slis {
println(k, v)
}
// map
// traverse map
for k, v := range classMate1 {
fmt.Println(k, v)
}