【发布时间】:2012-03-31 17:26:59
【问题描述】:
在Go中,如果我定义一个带有指针的函数作为接收者,它不应该只允许从指针调用函数吗?为什么从值本身调用这个函数就可以了,效果一样。
例如,在以下程序中: m1.reset() & m2.reset() 具有相同的效果。即使 m1 是一个值,而 m2 是一个指针。
我有点困惑,因为有两种方法可以做同样的事情,我不确定该遵循哪一种。尽管大部分代码都遵循使用指针字段调用函数的约定。我错过了什么吗?
package main
import "fmt"
type MyStruct struct {
X int
}
func (m *MyStruct) reset() {
m.X = 0
}
func main() {
m1 := MyStruct{1}
m2 := &MyStruct{1}
fmt.Println(m1.X)
fmt.Println(m2.X)
m1.reset()
m2.reset()
fmt.Println(m1.X)
fmt.Println(m2.X)
}
【问题讨论】:
-
您还可以添加,难道不应该取消引用传递的接收器参数
m *MyStruct,以访问函数reset()定义内的字段X,如(*m).X = 0。但这也是一种方便的速记或语法糖。