Go struct method
Golang 方法集
Golang 方法集 :每个类型都有与之关联的方法集,这会影响到接口实现规则。
- 类型 T 方法集包含全部 receiver T 方法。
- 如类型 S 包含匿名字段 T,则 S 和 *S 方法集包含 T 方法。
- 类型 *T 方法集包含全部 receiver T + *T 方法。
- 如类型 S 包含匿名字段 *T,则 S 和 *S 方法集包含 T + *T 方法。
- 不管嵌入 T 或 *T,*S 方法集总是包含 T + *T 方法。
在 Go 语言中,方法集(Method Set)是一个类型所拥有的方法的集合,它决定了该类型是否实现了某个接口。理解方法集对于正确使用接口和方法非常重要。下面我们详细解释一下你提供的规则,并举例说明。
1. 类型 T 方法集包含全部 receiver T 方法
这意味着如果一个方法的接收者是一个值类型(T),那么该方法只能属于 T 类型的值方法集。
package main
import "fmt"
type MyType struct{}
func (m MyType) ValueMethod() {
fmt.Println("Value method called")
}
func main() {
var v MyType
v.ValueMethod() // 可以调用
}
2. 类型 *T 方法集包含全部 receiver T + *T 方法
这意味着如果一个方法的接收者是一个指针类型(*T),那么该方法既属于 T 类型的值方法集,也属于 *T 类型的指针方法集。
package main
import "fmt"
type MyType struct{}
func (m MyType) ValueMethod() {
fmt.Println("Value method called")
}
func (m *MyType) PointerMethod() {
fmt.Println("Pointer method called")
}
func main() {
var v MyType
var p *MyType = &v
v.ValueMethod() // 可以调用
// v.PointerMethod() // 编译错误,值类型不能调用指针方法
p.ValueMethod() // 可以调用,指针类型可以调用值方法
p.PointerMethod() // 可以调用
}