
在 go 语言中,`(ip ip)` 是方法的**接收者声明**,表示该函数是为类型 `ip` 定义的**方法**而非普通函数;它使 `defaultmask()` 可通过 `ip.defaultmask()` 的方式被调用,同时赋予方法访问接收者值(此处为 `ip` 类型实例)的能力。
Go 区分函数(function) 和方法(method):函数不绑定任何类型,而方法必须关联一个接收者(receiver)。接收者写在 func 关键字之后、函数名之前,语法为 (t T) 或 (t *T),其中 t 是接收者参数名(可任意命名,推荐简洁有意义),T 是基础类型或已定义的命名类型(如 net.IP)。
以 func (ip IP) DefaultMask() IPMask 为例:
- ip 是接收者参数名,仅在方法体内有效;
- IP 是接收者类型(来自 net 包的切片别名:type IP []byte);
- 该方法属于值接收者(非指针),因此调用时会复制 ip 的副本。对 ip 的修改(如 ip = ip.To4())不会影响原始变量——但注意:ip.To4() 返回的是新切片,此处赋值仅影响局部 ip 变量,符合设计意图。
✅ 正确调用方式:
addr := net.ParseIP("192.168.1.1")
mask := addr.DefaultMask() // 通过点号调用,体现面向类型的设计⚠️ 注意事项:
- 接收者类型必须与方法所在包中定义的类型在同一包内(或为内置类型),否则编译报错(Go 不允许为其他包的类型定义方法,除非是该包自身);
- 若需在方法内修改接收者底层数据(如修改切片内容),应使用指针接收者 (*IP);但本例中 To4() 已返回新切片,且逻辑仅作判断,故值接收者更安全、高效;
- 接收者名称 ip 纯属局部标识,可替换为 _、x 或 self 等,但应保持语义清晰(ip 比 t 更易理解)。
总结:(ip IP) 是 Go 方法机制的核心语法,它将函数与类型绑定,支撑了 Go 轻量级的“面向类型”编程范式——无需 class 关键字,却能自然组织行为与数据,是理解标准库(如 net, strings, bytes)源码的关键入口。










