type T struct {
Tp int
}
func (t T) Set(a int) {
t.Tp = a
}
func main() {
t := T{}
fmt.Println(reflect.TypeOf(t.Set))
fmt.Println(reflect.TypeOf(T.Set))
}
result :
func(int)
func(main.T, int)
为什么T.set不等于t.set?
什么是原理或翻译?
最佳答案
t.Set 是一个 method value . T.Set 是一个 method expression .
方法值 t.Set
产生的函数等同于:
func(a int) ( t.Set(a) }
方法表达式 T.Set
产生一个函数,该函数等效于将接收者作为第一个参数的方法。
func(t T, a int) { t.Set(a) }
这playground example说明了方法值和方法表达式之间的区别。
抛开关于方法表达式和方法值的讨论, 函数 Set 应该采用指针接收器。否则,对 t 的更改将被丢弃。
func (t *T) Set(a int) {
t.Tp = a
}
这是 example与指针接收器。
关于Go类型方法不等于实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28012287/