浅析go方法receiver参数类型
go方法receiver参数类型有值类型和指针类型两种(func (t T)Method() {}或者func (t *T)Method() {})。当receiver参数类型为值类型(T)时,go函数采用的是值复制传递,函数体中的t是T类型实例的一个副本,这样在Method函数中对参数t所作的任何修改都只会影响副本,而不会影响到原T类型实例;当receiver参数类型为指针类型(*T)时,函数体中的t是T类型实例的地址,这样在Method函数中对参数t所作的任何修改都反应到原T类型实例。
如下示例:
type T struct {
a int
}
func (t T) Method() {
t.a = 1
}
func (t *T) Method2() {
t.a = 2
}
func main() {
var t T
fmt.Println(t.a)
t.Method()
fmt.Println(t.a)
t.Method2()
fmt.Println(t.a)
}
运行得到结果:
0 0 2
Method和Method2方法体内部都对字段a做了修改,但Method(采用值类型receiver)修改的只是实例的副本,对原实例并没有影响,因此调用Method后输出t.a为0(int类型默认值)。Method2(采用指针类型receiver)修改的是实例本身,故调用Method2后输出t.a为2。
Go语言基础及实战 文章被收录于专栏
Go语言学习笔记、语法知识、技术要点和个人理解及实战

