在 Go 中,func (*myHandler) ServeHTTP(...) 中的 (*myHandler) 是方法接收器,表示该方法属于 *myHandler 类型(即 myHandler 结构体的指针类型),是实现 http.Handler 接口的关键语法。
在 go 中,`func (*myhandler) servehttp(...)` 中的 `(*myhandler)` 是方法接收器,表示该方法属于 `*myhandler` 类型(即 `myhandler` 结构体的指针类型),是实现 `http.handler` 接口的关键语法。
在 Go 语言中,函数与方法有本质区别:函数不属于任何类型,而方法必须绑定到一个具体类型(称为“接收器”)上。func (*myHandler) ServeHTTP(...) 并非普通函数声明,而是一个方法声明,其中 (*myHandler) 就是该方法的接收器(receiver)。
接收器的语法形如 (t T) 或 (t *T),必须紧邻 func 关键字之后、方法名之前。它表明:
- 此 ServeHTTP 方法定义在类型 *myHandler 上;
- 任何 *myHandler 类型的值均可调用该方法(例如 h.ServeHTTP(w, r));
- 更重要的是:*只要一个类型实现了 http.Handler 接口要求的 `ServeHTTP(http.ResponseWriter, http.Request)` 方法,它就自动满足该接口**——这正是 Go 接口“隐式实现”的核心机制。
下面是一个完整示例:
type myHandler struct {
msg string
}
// ✅ 正确:为 *myHandler 定义 ServeHTTP 方法,实现 http.Handler 接口
func (*myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte("Hello from myHandler!"))
}
// 使用示例
func main() {
handler := &myHandler{msg: "demo"}
http.Handle("/hello", handler) // ✅ 合法:*myHandler 满足 http.Handler
http.ListenAndServe(":8080", nil)
}
⚠️ 注意事项:
- 若改为 func (myHandler) ServeHTTP(...)(值接收器),同样可实现接口,但每次调用会复制整个结构体;对含大字段或需内部状态修改的类型,推荐使用指针接收器;
- 接收器类型 T 必须与方法所在包一致,且不能是接口或指针类型(如 **myHandler 非法);
- http.ServeMux 和 http.ListenAndServe 等标准库函数只认 http.Handler 接口,不关心底层是结构体、指针还是其他类型——只要 ServeHTTP 方法签名匹配即可。
简言之,(*myHandler) 不是返回值,也不是装饰语法,而是 Go 类型系统将行为(方法)与数据(类型)绑定的显式声明,也是接口实现的基石。理解接收器,是掌握 Go 面向对象风格编程的第一步。











