数组、切片和Map
数组与切片
数组长度是类型的一部分。也就是说,长度为4的数组和长度为5的数组的类型是不相等的。
数组是值类型
声明
// 定长
var a [3]int
var b = [3]int{1,2,3}
var d := [...]int{0: 1, 5: 7} // 指定下标。长度是最大的下标值+1
// 变长
var c := [...]int{23,44} // 像这里已经给定了两个长度的值,但是
fmt.Println(c[2]) // 这里的c[2]是出界的,因为在给定值的时候该数组仍旧是定长的
// 多维
var e = [2][2]int{
{1,2},
{3,4}
}
遍历数组
var a := [...]{1,2,3}
for i := 0; i< len(a); i++ {
fmt.Println(a[i])
}
for k,v := range arr {
fmt.Printf("key: %v value: %v\n", k, v)
}
动态的数组的话就是切片
切片是引用类型
var arr1 = []int // 未赋值默认为nil
var arr2 = []int{1,2,3}
var arr2 = []int{0: 1, 1: 2, 2: 3}
// 基于数组定义切片
a := [5]int{1,2,3,4,5}
b := a[:] // 获取数组里面的所有值
// 基于切片的切片
a := []int{1,2,3,4,5}
b := a[1:] // 其实和基于数组的切片是一样的,只是写了获取范围
// 范围取值
c := a[1:3] // 左包右不包。获取下标1到下标3的值
// c := a[:3] // 获取第一个值到下标3的值
// c := a[1:] // 获取下标1到最后一个的值
// 长度与容量
fmt.Printf("长度%d 容量%d", len(a), cap(a)) // len()获取长度,cap获取容量
// 长度是元素的个数
// 容量是底层数组的个数
// 例如上面的c := a[1:3],结果是{2,3},那么长度是2,但容量是要拿着起始下标到原数组里看的。这里的起始下标是1,那么回到原数组,从下标1开始到末尾的所有值都是底层数组,所以{2,3,4,5}是底层数组,容量便是4
// 扩容
var slice0 []int // 空的切片,长度0,容量0
// slice0[0] = 1 // 这样写会报错
slice0 = append(slice0, 1) // 扩容必须用append
slice0 = append(slice0, 2)
slice0 = append(slice0, 3)
fmt.Println(slice0) // [1 2 3]
slice0 = append(slice0, 4,5,6)
fmt.Println(slice0) // [1 2 3 4 5 6]
// 注意,扩容会自动增加切片容量,增加的数值有算法,在附录中详述
// 合并
var slice1 []int
slice1 = append(slice1, slice0...) // 将slice0合并到slice1
// 删除元素
var slice3 := []int{1,2,3,4,5,6}
// 删除下标2元素
slice3 = append(slice3[:2],a[3:]...)
make()声明切片
// make([]T, size, cap)
// T: 切片的元素类型
// size: 切片中元素的数量
// cap: 切片的容量
var slice1 = make([]int, 4, 8)
fmt.Printf("长度: %d, 容量: %d", len(slice1), cap(slice1))
slice1[0] = 10
fmt.Println(slice1)
copy()函数复制切片
a := []int{1,2,3}
b := make([]int, 4,4)
copy(b,a)
map
map是无序的键值对数据结构,属于引用类型。
声明
// map[KeyType]ValueType
// 方法一
var userinfo = make(map[string]string)
userinfo["uname"] = "张三"
// 方法二
var userinfo = map[string]string{
"uname": "tom",
"uage": 18
}
// 方法三
userinfo := map[string]string{
"uname": "tom",
"uage": 18
}
查找
userinfo := map[string]string{
"uname": "tom",
"uage": 18
}
v, ok := userinfo["uage"]
删除
userinfo := map[string]string{
"uname": "tom",
"uage": 18,
"sex": "man",
}
delete(userinfo, "sex")