
在 go 语言中,`func (ip ip) defaultmask() ipmask` 中的 `(ip ip)` 是方法接收者声明,表示该函数是为类型 `ip` 定义的**方法**而非普通函数,接收者 `ip` 是类型 `ip` 的值(或指针),用于访问和操作该类型的实例。
Go 区分函数(function) 和 方法(method):函数独立于任何类型,而方法必须绑定到一个接收者(receiver)——即某个已定义的命名类型(不能是接口、指针类型字面量或内置类型如 int 直接作为接收者)。语法 func (r ReceiverType) MethodName(...) ReturnType 中的 (r ReceiverType) 就是接收者声明。
以 net.IP 类型的 DefaultMask() 方法为例:
func (ip IP) DefaultMask() IPMask {
if ip = ip.To4(); ip == nil {
return nil
}
switch true {
case ip[0] < 0x80:
return classAMask
case ip[0] < 0xC0:
return classBMask
default:
return classCMask
}
}这里:
- (ip IP) 表示:该方法的接收者名为 ip,类型为 net.IP(即 []byte 的别名);
- ip 在方法体内可像普通变量一样使用(如调用 ip.To4()、访问 ip[0]);
- 调用时需通过 IP 实例发起:addr := net.ParseIP("192.168.1.1"); mask := addr.DefaultMask();
- 接收者 ip 是值拷贝(因为是 IP 而非 *IP),因此该方法不会修改原始 IP 数据——这符合 DefaultMask() 的只读语义。
⚠️ 注意事项:
- 接收者类型必须是当前包定义的命名类型,或在其他包中定义但导出的类型(如 net.IP 是导出类型,故其方法可在 net 包内定义);
- 不可为 type MyInt int 定义接收者 func (i MyInt) ... 在另一个包中(跨包限制);
- 若需修改接收者状态,应使用指针接收者:func (ip *IP) Mutate();
- 接收者名称 ip 仅在方法作用域内有效,建议使用简短、语义清晰的名称(如 t for time.Time, s for string-like types)。
总结:(ip IP) 是 Go 方法的核心语法糖,它将函数“绑定”到类型上,实现面向对象风格的封装与行为归属,是理解 Go 类型系统与标准库设计的关键入口。掌握接收者机制,是写出可维护、符合 Go 惯例代码的基础。









