浅析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语言学习笔记、语法知识、技术要点和个人理解及实战

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务