
在 go 中,`(ip ip)` 是方法的接收者声明,用于将函数绑定到特定类型(此处为 `ip`),使其成为该类型的成员方法,而非普通函数。这是 go 实现面向对象编程的关键语法。
Go 不支持传统类(class)语法,而是通过接收者(receiver)机制为任意已命名类型定义方法。语法 func (ip IP) DefaultMask() IPMask 中的 (ip IP) 即为值接收者:
- ip 是接收者参数名(可任意命名,如 x、self 等,但应具描述性);
- IP 是接收者类型(必须是已定义的命名类型,不能是 []byte、map[string]int 等未命名类型);
- 该函数因此成为 IP 类型的方法,可通过 ipVar.DefaultMask() 调用。
例如:
type IP []byte
func (ip IP) DefaultMask() IPMask {
if ip = ip.To4(); ip == nil {
return nil
}
switch {
case ip[0] < 0x80: // 0.0.0.0 – 127.255.255.255 → Class A
return classAMask
case ip[0] < 0xC0: // 128.0.0.0 – 191.255.255.255 → Class B
return classBMask
default: // 192.0.0.0 – 255.255.255.255 → Class C
return classCMask
}
}
// 使用示例
addr := net.ParseIP("192.168.1.1")
mask := addr.DefaultMask() // ✅ 合法调用:addr 是 IP 类型实例⚠️ 注意事项:
- 接收者类型 IP 必须在当前包中定义(或为标准库导出类型,如 net.IP),且不能是接口或指针类型(*IP 是允许的,但需保持一致);
- 若方法需修改接收者状态(如原地更新切片内容),应使用指针接收者 func (ip *IP);本例中 ip.To4() 返回新切片,未修改原值,故值接收者足够;
- 接收者名称 ip 仅在方法体内有效,不暴露给调用方——它不是“this”或“self”,而是一个常规局部参数。
简言之,(ip IP) 不是函数参数,而是类型归属声明:它告诉 Go 编译器——“这个函数属于 IP 类型”。这是 Go 方法与普通函数的根本分界,也是其组合优于继承设计哲学的体现。









