我有一個界面
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,但在傳遞給容器結構時卻沒有。我也不能將物件傳遞給容器實體化。
uj5u.com熱心網友回復:
Foo1
沒有實作FooInterface
。*Foo1
做。這就是為什么你通過&foo1
而不是foo1
。對于型別引數,你應該把*Foo1
.
uj5u.com熱心網友回復:
我假設您的 TakesFooInterface 是這樣的:
func TakesFooInterface(foo1 FooInterface) {
...
}
然后呼叫 TakesFooInterface(foo1) 編譯失敗,因為 foo1 沒有實作 FooInterface 而是 &foo1。
與您的通用案例相同,該Foo1
型別不實作 FooInterface ,它需要方法中的指標訪問,HasName
但*Foo1
type 需要。
我在 Go.Dev 上的一些嘗試復制了您的代碼:https ://go.dev/play/p/3I2mtabi-ub
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/495745.html
上一篇:c#中如何統一同類方法
下一篇:使用通配符引數分配相同的泛型型別