我有一個界面type FooInterface interface { HasName() bool}它有一個我打算在 FooInterface 的其他實現中使用的基本實現type FooBoilerplate struct { hasName bool}func (f *FooBoilerplate) HasName() bool { return f.hasName}像這樣type Foo1 struct { fooId int FooBoilerplate}func (f *Foo1) GetId() int { return f.fooId}我想使用泛型為 FooInterface 創建一個容器類type FooContainer[T FooInterface] struct { list []T}func (fc *FooContainer[T]) AddItem() { var t T fc.list = append(fc.list, t)}但是,當我嘗試實例化容器時出現編譯錯誤func RunThis() { foo1 := Foo1{FooBoilerplate: FooBoilerplate{hasName: false}} // works fine TakesFooInterface(&foo1) // doesnt compile fc := FooContainer[Foo1]{} fc.AddItem()}不確定為什么 Foo1 在傳遞給函數時被視為實現 FooInterface,但在傳遞給容器結構時卻沒有。我也不能將對象傳遞給容器實例化。
2 回答

神不在的星期二
TA貢獻1963條經驗 獲得超6個贊
Foo1
不執行FooInterface
。*Foo1
做。無論接口是用作函數參數的類型還是用作約束,都是如此。
這就是為什么您將&foo1
(type *Foo1
) 傳遞給TakesFooInterface
而不是foo1
(type Foo1
) 的原因。
同樣對于類型參數,您應該實例化通用類型*Foo1
:
fc := FooContainer[*Foo1]{}

jeck貓
TA貢獻1909條經驗 獲得超7個贊
我假設你的 TakesFooInterface 是這樣的:
func TakesFooInterface(foo1 FooInterface) { ... }
然后調用 TakesFooInterface(foo1) 編譯失敗,因為 foo1 沒有實現 FooInterface,而是 &foo1。
與您的一般情況相同,該Foo1
類型沒有實現 FooInterface ,它需要在方法中訪問指針,HasName
但*Foo1
類型需要。
我已經在 Go.Dev 上復制了你的代碼和一些嘗試:https ://go.dev/play/p/3I2mtabi-ub
- 2 回答
- 0 關注
- 111 瀏覽
添加回答
舉報
0/150
提交
取消