我有這個例子// 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

慕村9548890
TA貢獻1884條經驗 獲得超4個贊
是的,您的結構實現了嵌入類型的方法集。
但是,當您更改Incr
to的簽名時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 的提升方法。
- 2 回答
- 0 關注
- 217 瀏覽
添加回答
舉報
0/150
提交
取消