接收器类型的方法集

规格说:


类型的方法集决定了该类型实现的接口以及可以使用该类型的接收器调用的方法。


所以,为了验证这一点,下面是代码:


package main


import "fmt"


// I interf

type I interface {

    hello()

    goodbye()

}


// T type

type T struct {

    name string

}


func (t T) hello() {

    fmt.Println("Hello", t.name)

}


func (t *T) goodbye() {

    fmt.Println("Goodbye", t.name)

}


func main() {

    var t1 T = T{"James"}

    t1.hello()

    t1.goodbye()

}

t1.goodbye()尽管goodbye()方法不是类型的方法集的一部分,T但仍然有效。因为,t1.goodbye()在内部工作,因为(&t1).goodbye()它满足以下规则:


如果您有 aT并且它不可寻址,则只能调用接收器类型为 的方法T,而不是*T。


但是,规范说,方法调用遵循以下规则:


类型的方法集决定了该类型实现的接口以及可以使用该类型的接收器调用的方法。


t1.goodbye()as (&t1).goodbye()break 方法调用规则的调用吗?


繁华开满天机
浏览 137回答 1
1回答

慕婉清6462132

从规范中的调用...如果 x 的(类型)的方法集包含 m 并且参数列表可以分配给 m 的参数列表,则方法调用 xm() 是有效的。如果 x 是可寻址的并且 &x 的方法集包含 m,则 xm() 是 (&x).m() 的简写t1 是可寻址的。&t1 的方法集包含 goodbye()。t1.goodbye() 是 (&t1).goodbye() 的简写。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go