在Go 中使用泛型時,區分類型參數及其約束至關重要。類型參數以大寫字母表示,例如 T,而約束是定義類型參數所需行為的介面類型。例如:
<code class="go">type GS interface { Id() string SetId(string) }</code>
在這種情況下,GS 是約束,它指定實作 GS 的類型必須具有具有特定簽章的 Id() 和 SetId() 方法。
在泛型中使用 T 等型參數時,必須了解 *T 與 T 不同。 *T 表示指向型別參數 T 的指標。
在您的範例中,遇到的錯誤是:
type *T is pointer to type parameter, not type parameter
嘗試在類型參數(T 上使用指標方法(本例中為SetId() )時會發生此錯誤)。但是,指針方法僅適用於指向型別參數 (*T) 的指針,而不適用於型別參數本身。
要解決此問題,您需要明確指定類型參數的指標的限制。這可以透過增加額外的約束來完成:
<code class="go">type GS interface { Id() string SetId(string) } type PT interface { *GS }</code>
現在您可以使用PT 作為MyStore 上的約束:
<code class="go">type MyStore[T PT] struct { values map[string]T }</code>
將MyStore 中*T 的出現次數更改為T結構體和方法定義也是必要的。
錯誤訊息也表示類型 A 沒有實作 GS 接口,因為 A 中的 SetId() 方法有一個指標接收器。要解決此問題,您需要確保 A 類型正確實作 GS 介面:
<code class="go">func (a *A) SetId(id string) { a.ID = id }</code>
透過這些修改,程式碼應該可以成功編譯。
以上是為什麼在 Go 中使用泛型時會出現「Type *T 是指向型別參數的指針,而不是型別參數」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!