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

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

在“A Go Tour”中,如何修改接口以需要指針上的方法?

在“A Go Tour”中,如何修改接口以需要指針上的方法?

Go
Cats萌萌 2021-11-15 20:38:17
在接口的“A Go Tour”中,我們有這個接口:type Abser interface {    Abs() float64}說明這種類型Vertex不滿足上述Abser:type Vertex struct {    X, Y float64}func (v *Vertex) Abs() float64 {    return math.Sqrt(v.X*v.X + v.Y*v.Y)}如何修改 Abser 接口以使 Vertex 滿足它?(如果它不再滿足完整示例中的 MyFloat 也沒關系。)在我發布這個問題之前,我花了幾個小時搜索和撓頭,但發布后我發現了另一個 SO 問題,它涵蓋了類似的材料,可能對其他新手有幫助:
查看完整描述

1 回答

?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

您對什么正在實施什么感到有些困惑。在這種情況下,*Vertex正在實現Abser而不是Vertex讓它也這樣Vertex做,您必須更改實現中的接收類型Abs,使其不是指針;


func (v Vertex) Abs() float64 {

    return math.Sqrt(v.X*v.X + v.Y*v.Y)

} // Vertex implementing Abser here

所以你表達這個問題的方式有點誤導。接口不需要更改,應該不會收到任何更改。僅供參考,您可以同時擁有*Vertex并Vertex使用我上面提供的方法以及您已經擁有的方法來實現接口。


這是在 Go 中經常絆倒人們的一點。當你聲明func (t SomeType)你指定接收類型時,如果這是一個指針,(t *SomeType)那么實現接口的東西不是SomeType而是*SomeType。這與方法由類實現的其他語言略有不同,無論您使用的是引用還是值都沒有關系。在 Go 中,該類不實現該方法,您指定“接收類型” - 可以調用該方法的東西 - 第一個參數實際上被壓入堆棧并與傳遞給方法的參數相同,區別僅與編譯有關(接口實現確實是具有 afaik 功能的唯一原因)。所以,總而言之,如果你想Vertex實現Abser具有單個方法的接口,Abs() float64那么您需要將該函數定義為func (v Vertex) Abs() float64 { ... }.


只是為了有清晰可讀的代碼,我建議不要為指針和值定義接口......您可以使用地址或取消引用運算符來解決這個問題。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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