函数声明语法:函数名称前括号内的内容
抱歉,我无法在问题标题中更加具体,但是我正在阅读一些Go代码,并且遇到了这种形式的函数声明:
func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { ...
}
来自https://github.com/mattermost/platform/blob/master/api/context.go
func (s *GracefulServer) BlockingClose() bool { ...
}
来自https://github.com/braintree/manners/blob/master/server.go
什么是(h handler)
与(s *GracefulServer)
括号平均值之间?考虑到括号之间事物的含义,整个函数声明是什么意思?
编辑
这与Go中的功能和方法有何不同?:之所以问这个问题,是因为我不知道函数名之前括号中的内容是什么,不是因为我想知道函数和方法之间的区别是什么…如果我知道此声明是一个方法,我不会首先没有这个问题。如果有一天,某人与我有同样的疑问,我不相信她会去寻找“
golang方法”,因为她不知道这种情况。这就像想知道字母“
sigma”在数学表达式之前是什么意思(不知道它表示求和),并且有人说这是求和与其他事物之间的区别的重复。
同样,对这个问题的简短回答(“它是一个接收者”)不是对“函数和方法之间的区别”的回答。
回答:
这称为“接收器”。第一种情况(h handler)
是值类型,第二种(s
*GracefulServer)情况是指针。Go的工作方式可能与某些其他语言有所不同。但是,在大多数面向对象的编程中,接收类型或多或少像一个类。这是您从中调用方法的事情,就像如果我将某个方法A
放在某个类的旁边,Person
那么我将需要一个类型的实例Person
来进行调用A
(假设它是一个实例方法,而不是静态的!)。
这里有一个问题是,接收器获取的情况下被推到像其他参数调用堆栈,所以如果接收者是一个值的类型,比如handler
,你将在的东西拷贝一起工作你的意思是这样调用的方法`h.Name
“Evan”`会返回调用范围后无法持久保存。出于这个原因,任何希望改变接收器状态的事物都需要使用指针或返回修改后的值(如果您正在寻找更多的不可变类型范例,则可以使用)。
这是规范中的相关部分;https://golang.org/ref/spec#Method_sets
以上是 函数声明语法:函数名称前括号内的内容 的全部内容, 来源链接: utcz.com/qa/399449.html