指针:

    1. 指针就是地址。 指针变量就是存储地址的变量。
    2. *p 解引用、间接引用。
    3. 栈帧: 用来给函数运行提供内存空间。 取内存于 stack 上。
    4. 当函数调用时,产生栈帧。函数调用结束,释放栈帧。
    5. 栈帧存储: 1. 局部变量。 2. 形参。 (形参与局部变量存储地位等同) 3. 内存字段描述值
    6. 指针使用注意:
    7. 空指针:未被初始化的指针。 var p *int *p --> err
    8. 野指针:被一片无效的地址空间初始化。
    9. 格式化输出:
    10. %q Go语言格式显示字符串。 默认带有“”符
    11. %v 显示对应数据详细信息
    12. 变量存储:
    13. 等号 左边的变量,代表 变量所指向的内存空间。 (写)
    14. 等号 右边的变量,代表 变量内存空间存储的数据值。 (读)
    15. 指针的函数传参(传引用)。
    16. 传地址(引用):将形参的地址值作为函数参数传递。
    17. 传值(数据据):将实参的 拷贝一份给形参。
    18. 传引用: A栈帧内部,修改B栈帧中的变量值。

    切片:

    1. 为什么用切片:
    2. 1. 数组的容量固定,不能自动拓展。
    3. 2. 值传递。 数组作为函数参数时,将整个数组值拷贝一份给形参。
    4. Go语言当,我们几乎可以在所有的场景中,使用 切片替换数组使用。
    5. 切片的本质:
    6. 不是一个数组的指针,是一种数据结构体,用来操作数组内部元素。
    7. runtime/slice.go type slice struct {
    8. *p
    9. len
    10. 切片的使用: cap
    11. }
    12. 数组和切片定义区别:
    13. 创建数组时 [ ] 指定数组长度。
    14. 创建切片时, [] 为空,或者 ...
    15. 切片名称 [ low : high : max ]
    16. low: 起始下标位置
    17. high:结束下标位置 len = high - low
    18. 容量:cap = max - low
    19. 截取数组,初始化 切片时,没有指定切片容量时, 切片容量跟随原数组(切片)。
    20. s[:high:max] : 0 开始,到 high结束。(不包含)
    21. s[low:] : low 开始,到 末尾
    22. s[: high]: 0 开始,到 high结束。容量跟随原先容量。【常用】
    23. 切片创建:
    24. 1. 自动推导类型创建 切片。slice := []int {1, 2, 4, 6}
    25. 2. slice := make([]int, 长度,容量)
    26. 3. slice := make([]int, 长度) 创建切片时,没有指定容量, 容量== 长度。【常用】
    27. 切片做函数参数 —— 传引用。(传地址)
    28. append:在切片末尾追加元素
    29. append(切片对象, 待追加元素)
    30. 向切片增加元素时,切片的容量会自动增长。1024 以下时,一两倍方式增长。
    31. copy
    32. copy(目标位置切片, 源切片)
    33. 拷贝过程中,直接对应位置拷贝。

    map:

    1. 字典、映射 key —— value key 唯一、无序。 不能是引用类型数据。
    2. map 不能使用 cap()
    3. 创建方式:
    4. 1. var m1 map[int]string --- 不能存储数据
    5. 2. m2 := map[int]string{} ---能存储数据
    6. 3. m3 := make(map[int]string) ---默认len = 0
    7. 4. m4 := make(map[int]string, 10)
    8. 初始化:
    9. 1. var m map[int]string = map[int]string{ 1: "aaa", 2:"bbb"} 保证key彼此不重复。
    10. 2. m := map[int]string{ 1: "aaa", 2:"bbb"}
    11. 赋值:
    12. 赋值过程中,如果新map元素的key与原map元素key 相同 ——> 覆盖(替换)
    13. 赋值过程中,如果新map元素的key与原map元素key 不同 ——> 添加
    14. map的使用:
    15. 遍历map
    16. for key值, value := range map {
    17. }
    18. for key := range map {
    19. }
    20. 判断mapkey是否存在。
    21. map[下标] 运算:返回两个值, 第一个表 value 的值,如果value不存在。 nil
    22. 第二个表 key是否存在的bool类型。存在 true 不存在false
    23. 删除map
    24. delete()函数: 1 待删除元素的map 2 key
    25. deletemap key 删除一个不存在的key 不会报错。
    26. map 做函数参数和返回值,传引用。