Go中引用和值类型| 青训营笔记

67 阅读2分钟

这是我参与 第三届青训营-后端场 笔记创作活动的第3篇笔记

Go语言的引用

  1. string类型
type stringStruct struct {
    str unsafe.Pointer
    len int
}
  • string作为参数传递时候为值类型,每次传递会拷贝相同一份
  1. int,int64,float等
  • 他们作为参数传递时候为值类型,每次传递会拷贝相同一份
  1. struct
  • 和C一样,作为值传递,每次传递会拷贝相同一份
  1. map
struct Hmap
{
    uint8   B;    // 可以容纳2^B个项
    uint16  bucketsize;   // 每个桶的大小

    byte    *buckets;     // 2^B个Buckets的数组
    byte    *oldbuckets;  // 前一个buckets,只有当正在扩容时才不为空
};
  • map需要通过make生成,而不能通过Var声明,说明它底层为指针,则传递为引用
  1. slice
// slice
type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}
  • 类似C指针,引用类型
  1. chan
  • 也需要make生成,说明也是引用类型
  1. interface
  • 著名的鸭子类型,也是引用类型,类似空指针

指针

  • 指针和C类似

总结

值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数

引用传递:所谓引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。最早出现c++中

易错分析

  1. 当strcut有map时候初始化一定要make,不然会出错
  2. interface类似空指针
  3. 不能比较空接口中的动态值
  4. 按照Go语言规范,任何类型在未初始化时都对应一个零值:布尔类型是false,整型是0,字符串是"",而指针,函数,interface,slice,channel和map的零值都是nil。
  5. 严格来说,Go 语言没有引用类型。
  • 但是我们可以把 map、chan、函数、接口、slice 切片, 称为引用类型,这样便于理解。
  • 指针类型也可以理解为是一种引用类型。