1 回答

TA貢獻(xiàn)1801條經(jīng)驗 獲得超16個贊
關(guān)于使用 *T
簡而言之,類型參數(shù)不是它的約束。該約束僅確定 上可用的操作T
,它并不暗示關(guān)于 的任何內(nèi)容*T
,它現(xiàn)在只是一個未命名的指針類型。這是意義:
type *T 是指向類型參數(shù)的指針,而不是類型參數(shù)
因此,與您的情況一樣,方法集*T
不會自動包含在T
具體類型上聲明的指針接收器方法A
,并且它不會實現(xiàn)將由 實現(xiàn)的接口*A
。
您必須通過設(shè)置額外的約束將其明確告知編譯器。在簡化形式中,它類似于:
func Foo[T any, PT interface { SetId(string); *T}](v T) {}
您可以在此處找到有關(guān)此用例的更多示例和變體:
關(guān)于實施約束
&MyStore[A]{}
錯誤消息清楚地報告了此實例化失敗的原因:
A沒有實現(xiàn)GS(SetId方法有指針接收者)
換句話說SetId()
,聲明于*A
,而不是A
。因此你應(yīng)該實例MyStore
化*A
:
var storeA = &MyStore[*A]{}
然后*T
將結(jié)構(gòu)/方法定義中的出現(xiàn)更改為T
:
type MyStore[T GS] struct { values map[string]T // just T instead of *T } func (s *MyStore[T]) add(item T) { }
在使用字段類型實例化時,*A
將變得等效于map[string]*A
因此使分配storeA.values = make(map[string]*A)
有效,并且方法簽名add(item *A)
因此允許storeA.add(&A{})
.
固定游樂場:https ://gotipplay.golang.org/p/dcUVJ5YQK_b
- 1 回答
- 0 關(guān)注
- 136 瀏覽
添加回答
舉報