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?
这是什么原理或翻译?

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

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