在Golang中,任意类型T()都能够调用*T的方法吗?反过来呢?
在 Go 语言中,对于一个给定的类型 T
,接收者为 T
的方法可以被 T
类型的值和 *T
类型的指针调用。这是因为 Go 在尝试匹配方法接收者的类型时会自动做取址或解引用的操作。
例如:
type MyType int
func (m MyType) ValueMethod() {
fmt.Println("ValueMethod called")
}
func (m *MyType) PointerMethod() {
fmt.Println("PointerMethod called")
}
var v MyType
var p = &v
v.ValueMethod() // 正常调用
p.ValueMethod() // 正常调用,Go 自动将 p 解引用
v.PointerMethod() // 正常调用,Go 自动取 v 的地址
p.PointerMethod() // 正常调用
然而,如果 T
是一个接口类型,情况就有所不同。接口类型的值不能调用接口类型的指针的方法。
总的来说,对于非接口类型 T
和 *T
,它们可以调用彼此的方法。但对于接口类型,值类型接口不能调用指针类型接口的方法。这是因为接口类型的值和指针遵循不同的规则。