这是我参与 第三届青训营-后端场 笔记创作活动的第3篇笔记
Go语言的引用
- string类型
type stringStruct struct {
str unsafe.Pointer
len int
}
- string作为参数传递时候为值类型,每次传递会拷贝相同一份
- int,int64,float等
- 他们作为参数传递时候为值类型,每次传递会拷贝相同一份
- struct
- 和C一样,作为值传递,每次传递会拷贝相同一份
- map
struct Hmap
{
uint8 B; // 可以容纳2^B个项
uint16 bucketsize; // 每个桶的大小
byte *buckets; // 2^B个Buckets的数组
byte *oldbuckets; // 前一个buckets,只有当正在扩容时才不为空
};
- map需要通过make生成,而不能通过Var声明,说明它底层为指针,则传递为引用
- slice
// slice
type slice struct {
array unsafe.Pointer
len int
cap int
}
- 类似C指针,引用类型
- chan
- 也需要make生成,说明也是引用类型
- interface
- 著名的鸭子类型,也是引用类型,类似空指针
指针
- 指针和C类似
总结
值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数
引用传递:所谓引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。最早出现c++中
易错分析
- 当strcut有map时候初始化一定要make,不然会出错
- interface类似空指针
- 不能比较空接口中的动态值
- 按照Go语言规范,任何类型在未初始化时都对应一个零值:布尔类型是false,整型是0,字符串是"",而指针,函数,interface,slice,channel和map的零值都是nil。
- 严格来说,Go 语言没有引用类型。
- 但是我们可以把 map、chan、函数、接口、slice 切片, 称为引用类型,这样便于理解。
- 指针类型也可以理解为是一种引用类型。