首頁  >  文章  >  後端開發  >  為什麼在 Go 中使用泛型時會出現「Type *T 是指向型別參數的指針,而不是型別參數」?

為什麼在 Go 中使用泛型時會出現「Type *T 是指向型別參數的指針,而不是型別參數」?

Patricia Arquette
Patricia Arquette原創
2024-11-05 12:53:02640瀏覽

Why Do I Get

使用泛型:類型*T 是指向型別參數的指針,而不是型別參數

理解型別參數與限制

在Go 中使用泛型時,區分類型參數及其約束至關重要。類型參數以大寫字母表示,例如 T,而約束是定義類型參數所需行為的介面類型。例如:

<code class="go">type GS interface {
    Id() string
    SetId(string)
}</code>

在這種情況下,GS 是約束,它指定實作 GS 的類型必須具有具有特定簽章的 Id() 和 SetId() 方法。

型別 * T 與型別參數

在泛型中使用 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn