henryspace

记录精彩的程序人生 开始使用

Part 9 - Go 语言学习 - 数组、切片、容器

数组、切片、容器

  1. 数组的定义和循环
var arr1 [5]int
arr2 := [3]int{1,3,5}
arr3 := [...]int{2,4,6,8,10} //编译器自动识别数组元素个数
var grid [4][5]int  // 二维数组

fmt.Println(arr1, arr2, arr3, grid)

// 数组循环
for i := 0; i < len(arr3); i++ {
	fmt.Println(arr3[i])
}

// range循环方式
for i, v := range arr3 {
	fmt.Println(i, v)
}

  1. 数组是值类型
  • 即数组被声明后,其值不会被改变
var arr = [2]int{1,3}
arr[1] = 5 //此时arr中的值不会被赋值

  • [10]int 和 [20]int 是不同类型
  • 调用func(arr [10]int) 会拷贝一个数组作为参数传递,原数组不变
  • 在go语言中一般不直接使用数组, 而是切片
  1. 切片(slice)
  • 切片的声明
arr := [...]int{0,1,2,3,4,5,6,7}
arr := [...]int{0,1,2,3,4,5,6,7}
fmt.Println(arr[2:6])
fmt.Println(arr[:6])
fmt.Println(arr[2:])
fmt.Println(arr[:])

结果:
[2 3 4 5]
[0 1 2 3 4 5]
[2 3 4 5 6 7]
[0 1 2 3 4 5 6 7]
  • 切片是原数组的一个view,修改切片的值,也会改掉原数组的值
  • slice底层实现
slice {
    ptr 指向最初元素的指针
    len 元素长度
    cap 元素容量
}
  • slice可以向后扩展,不可以向前扩展
  • s[i] 不可以超越len(s), 向后扩展不可以超越底层数组cap(s)
  • 向slice添加元素, 添加的元素不会影响愿数组,修改才会
s := append(s, 1000)
  • 添加元素时如果超过cap, 系统会重新分配更大的底层数组,容量小于1024的时候是翻倍,大于是0.25倍添加

slice 应用

  1. 声明
  2. var s []int // 空值,显示为 []
  3. s := make([]int, 16) // 声明一个len长度为16的切片
  4. s := make([]int, 16, 32) // 声明一个len=16,cap=32的切片
  5. 复制,删除
// 复制, 把s2拷贝到s1
copy(s2, s1)
// 删除, 下标去除
s[:2]

map的操作

  1. 声明
  • 创建:make(map[string]int)
  • 获取元素:m[key]
  • key不存在时,获得value类型的初始值
var a = make(map[int]int)
b := map[string]string{
    "id": "xxxxxxx",
    "name": "jack",
    "sex": "male"
}
  • map的遍历
    使用range遍历key, 或者遍历key, value对,不保证遍历顺序,如需顺序,需手动对key排序
  • map的key
map使用哈希表,必须可以比较相等;
除了slice,map,function的内建类型都可以作为key;
Struct类型不包含上述三个字段的话,也可以作为key
评论
留下你的脚步