2 回答

TA貢獻1719條經驗 獲得超6個贊
您指向結構的指針應該實現接口。通過這種方式,您可以修改其字段。
看看我是如何修改你的代碼的,讓它按你的預期工作:
package main
import (
"fmt"
)
type IFace interface {
SetSomeField(newValue string)
GetSomeField() string
}
type Implementation struct {
someField string
}
func (i *Implementation) GetSomeField() string {
return i.someField
}
func (i *Implementation) SetSomeField(newValue string) {
i.someField = newValue
}
func Create() *Implementation {
return &Implementation{someField: "Hello"}
}
func main() {
var a IFace
a = Create()
a.SetSomeField("World")
fmt.Println(a.GetSomeField())
}

TA貢獻1831條經驗 獲得超9個贊
簡單的答案是,您將無法在以SetSomeField
您想要的方式工作的同時讓結構實現您的接口。
但是,指向結構的指針將實現接口,因此更改您的Create
方法 doreturn &obj
應該可以使事情正常工作。
潛在的問題是您修改后的SetSomeField
方法不再在Implementation
. 雖然該類型*Implementation
將繼承非指針接收器方法,但反之則不然。
其原因與指定接口變量的方式有關:訪問存儲在接口變量中的動態值的唯一方法是復制它。例如,想象以下內容:
var impl Implementation var iface IFace = &impl
在這種情況下,調用可以iface.SetSomeField
工作,因為它可以復制指針以用作方法調用中的接收者。如果我們直接在接口變量中存儲一個結構體,我們需要創建一個指向該結構體的指針來完成方法調用。一旦創建了這樣的指針,就可以訪問(并可能修改)接口變量的動態值而無需復制它。
- 2 回答
- 0 關注
- 263 瀏覽
添加回答
舉報