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

标签 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

最佳答案

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/

相关文章:

go - go map值和nil之间的差异

google-app-engine - 使用 golang 在 Appengine 数据存储区中强制执行关键唯一性的最佳方法(性能方面)是什么?

go - 创建多维数组

go - 如何使用 fmt.Sscan 将整数解析为数组?

mongodb - MongoDB Compass Filter表达式转换为Go bson.M表达式

mongodb - 使用 MongoDB 按多个值进行 Golang 聚合组

go - grpc 服务器是否使用一个新的 goroutine 来处理一个方法调用?

c++ - golang 的 Swig 包装器

sockets - 如何通过 Go 中的套接字检索文件数据?

go - 使用应用程序上下文作为查询的父上下文