Go类型方法不等于实例方法

时间:2015-01-18 16:54:45

标签: go

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?
什么是原则或翻译与此相关?

http://play.golang.org/p/xYnWZ3PlyF

1 个答案:

答案 0 :(得分:1)

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