在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,它们可以调用彼此的方法。但对于接口类型,值类型接口不能调用指针类型接口的方法。这是因为接口类型的值和指针遵循不同的规则。

发表评论

后才能评论