亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

結構是否實現了其嵌入類型之一實現的所有接口?

結構是否實現了其嵌入類型之一實現的所有接口?

Go
catspeake 2021-11-01 10:44:50
我有這個例子// embed project main.gopackage mainimport (    "fmt")type A struct {    A1 int    A2 int}func (a A) Incr() int {    a.A1++    return a.A1}type B struct {    A    D int}type C interface {    Incr() int}func Add(c C) {    d := c.Incr()    fmt.Println(d)}func main() {    var s B    s.Incr() //B has Incr    Add(s)}使用這個例子,我想檢查 B 是否實現了接口 C。在本例中,添加 accept s(類型 B)作為輸入。B 實施 C .但是當我將 Incr() 方法從原始更改為func (a *A) Incr() int {    a.A1++    return a.A1}它編譯器給出了錯誤./main.go:35:不能在 AddContent 的參數中使用 s(類型 B)作為類型 C:B 沒有實現 C(Incr 方法有指針接收器)所以我仍然很困惑一個結構是否實現了它們的一個嵌入類型實現的所有接口。
查看完整描述

2 回答

?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

如果 S 包含匿名字段 T,則 S 和 *S 的方法集都包含接收者 T 的提升方法。 *S 的方法集還包括接收者 *T 的提升方法。

如果 S 包含匿名字段 *T,則 S 和 *S 的方法集都包含帶有接收者 T 或 *T 的提升方法。

B 嵌入 A,因此 B 的方法集包括帶有接收器 A 的原型方法,但不包括 *A


查看完整回答
反對 回復 2021-11-01
?
慕村9548890

TA貢獻1884條經驗 獲得超4個贊

是的,您的結構實現了嵌入類型的方法集。

但是,當您更改Incrto的簽名時func (a *A) Incr() int,您需要一個指向該方法接收者的指針。當它有一個指針接收器時,它A本身不會實現Incr。

s.Incr()調用起作用的原因是該s值是可尋址的,并且 Go 會自動為方法調用引用它。當您傳遞s到 時Add,您試圖將其轉換為C接口,該值將不再可尋址,并且該Incr方法不在方法集中。

在這種情況下,您可以將嵌入類型更改為*A,

type B struct {
    *A
    D int}

s電話地點的地址

Add(&s)

或制作s一個指針 ( *B):

s := &B{}
Add(s)

規范相關部分

給定一個結構類型 S 和一個名為 T 的類型,提升的方法包含在結構的方法集中,如下所示:

  • 如果 S 包含匿名字段 T,則 S 和 *S 的方法集都包含接收者 T 的提升方法。 *S 的方法集還包括接收者 *T 的提升方法。

  • 如果 S 包含匿名字段 *T,則 S 和 *S 的方法集都包含帶有接收者 T 或 *T 的提升方法。


查看完整回答
反對 回復 2021-11-01
  • 2 回答
  • 0 關注
  • 217 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號