很抱歉,我无法在问题标题中更具体地说明问题,但我在阅读大约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)是什么意思?考虑到括号之间的含义,整个函数声明意味着什么?

编辑

这不是Whats the difference of functions and methods in Go?的翻版:我问这个问题是因为我不知道函数名前括号中的东西是什么,不是因为我想知道函数和方法之间的区别是什么...如果我知道这个声明是一种方法,我一开始就不会有这个问题.如果有一天有人和我有同样的怀疑,我不相信她会go 寻找"golang方法",因为她不知道这是事实.这就像是想知道字母"sigma"在一个数学表达式之前是什么意思(不知道它的意思是求和),有人说这是求和和和其他东西之间区别的重复.

此外,这个问题的简短答案("它是一个接收器")并没有回答"函数和方法之间的区别是什么".

推荐答案

这被称为"接收器".在第一种情况下(h handler)是值类型,在第二种情况下(s *GracefulServer)是指针.这在Go中的工作方式可能与其他一些语言有所不同.然而,在大多数面向对象编程中,接收类型的工作方式或多或少类似于类.这就是你调用方法的来源,就像我把一些方法A放在某个类Person中,那么我需要一个Person类型的实例来调用A(假设它是一个实例方法,而不是静态的!).

这里的一个问题是,接收器像其他参数一样被推到调用堆栈上,因此如果接收器是值类型,比如handler,那么您将处理您调用的方法的副本,这意味着在您返回到调用作用域之后,h.Name = "Evan"之类的东西将不会持续存在.出于这个原因,任何期望更改接收器状态的东西都需要使用指针或返回修改后的值(如果您正在寻找的话,可以提供更多的不可变类型范例).

这是说明书中的相关章节;https://golang.org/ref/spec#Method_sets

Go相关问答推荐

如何从google.golang.org/grpc/stats包中将golang中不同事件的输出进行组合,以获取func HandlePRC

Go编译器标志-修剪路径不完全工作

带有条件的for循环中缺少RETURN语句

如何将GoFr筛选器用于查询参数?

Python样式生成器实现为通道:过早读取

golang testscript .txtar 语法,用于 stderr 或 stdout 中包含的文本

如何将 goose 迁移与 pgx 一起使用?

Go Gin:验证 base64

Caddy服务器try 打开端口80而不是8090.

Golang prometheus:有没有办法衡量出站请求的指标?

有没有办法计算枚举中定义的项目总数?

如何使用 Go 代理状态为 OK 的预检请求?

GOLANG:为什么 SetDeadline/SetReadDeadline/SetWriteDeadline 在使用 os.File.Fd() 时对文件不起作用?

访问传递给可变参数函数的通用 struct 的特定字段

在 Golang 中,如何将接口作为泛型类型与 nil 进行比较?

使用 Golang 在字符串中循环重复数据

在 Go 中发送 ack 和 term 后消息仍在 nats 限制队列中

gorm 获取列名

为什么import和ImportSpec之间可以出现多行注释,而PackageName和ImportPath之间不能出现?

HCL 解码:具有多个标签的块