Golang中值类型(value type)和引用类型(reference type)有如下区别:
1.赋值方式不同
值类型的赋值是做值拷贝,引用类型是做地址拷贝。
2.存储位置不同
值类型存储值本身,引用类型存储地址。
3.复制开销不同
值类型赋值需要复制值本身,开销较大。引用类型赋值只复制地址,开销较小。
4.传参方式不同
值类型在函数调用时,值会复制一份传递。引用类型只传递地址拷贝。
5.本身不同
值类型表示一个固定值,引用类型表示对存储在别处的值的引用。
具体来说:
值类型包括:
- 基本数据类型:int float string bool
- 数组类型
- struct(如果所有字段都是值类型)
引用类型包括:
- 指针类型
- slice 和 map
- struct (如果有引用类型字段)
- 接口类型
- 函数类型
- channel类型
举例来说:
var a int // 值类型
var p *int // 引用类型
var s struct {
name string
age int
} // 值类型
type Person struct {
name string
age int
}
var p Person //引用类型