Go类型方法不等于实例方法
Go type method not equal to instance method
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 is a 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。
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 is a 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。