很抱歉我无法在问题标题中提供更具体的信息,但我正在阅读一些内容Go https://golang.org/代码和我遇到了这种形式的函数声明:
func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
...
}
from https://github.com/mattermost/platform/blob/master/api/context.go https://github.com/mattermost/platform/blob/master/api/context.go
func (s *GracefulServer) BlockingClose() bool {
...
}
from https://github.com/braintree/manners/blob/master/server.go https://github.com/braintree/manners/blob/master/server.go
什么是(h handler)
和(s *GracefulServer)
括号之间是什么意思?考虑到括号之间的含义,整个函数声明意味着什么?
Edit
这不是重复的Go中的函数和方法有什么区别? https://stackoverflow.com/questions/8263546/whats-the-difference-of-functions-and-methods-in-google-go:我提出这个问题是因为我不知道函数名称之前括号中的内容是什么,而不是因为我想知道函数和方法之间有什么区别......如果我知道这个声明是一个方法,我就不会'我一开始就没有这个问题。如果有一天有人和我有同样的疑问,我不相信她会去寻找“golang方法”,因为她不知道情况是这样的。这就像想知道数学表达式之前的字母“sigma”意味着什么(不知道它意味着求和),而有人说它是求和与其他事物之间的区别的重复。
另外,这个问题的简短答案(“它是一个接收器”)并不是“函数和方法之间有什么区别”的答案。
这称为“接收器”。在第一种情况下(h handler)
它是一个值类型,在第二个(s *GracefulServer)
它是一个指针。 Go 中的工作方式可能与其他一些语言略有不同。然而,接收类型的工作方式或多或少类似于大多数面向对象编程中的类。这是你调用方法的地方,就像我放了一些方法一样A
在某个班级内Person
那么我需要一个类型的实例Person
为了打电话A
(假设它是一个实例方法而不是静态方法!)。
这里的一个问题是接收者像其他参数一样被推入调用堆栈,因此如果接收者是值类型,就像在这种情况下handler
那么你将处理你所谓的方法的副本,其含义类似于h.Name = "Evan"
返回调用范围后不会持续存在。因此,任何想要改变接收器状态的东西都需要使用指针或返回修改后的值(如果您正在寻找的话,可以提供更多不可变类型范例)。
这是规范中的相关部分;https://golang.org/ref/spec#Method_sets https://golang.org/ref/spec#Method_sets
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)