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 { ... }.
只是為了有清晰可讀的代碼,我建議不要為指針和值定義接口......您可以使用地址或取消引用運算符來解決這個問題。
- 1 回答
- 0 關注
- 176 瀏覽
添加回答
舉報