Golang中值类型(value type)和引用类型(reference type)区别是什么?

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 //引用类型