首頁 >後端開發 >Golang >為什麼Go在使用泛型時會拋出錯誤「type *T ispointer to typeparameter, not typeparameter」?

為什麼Go在使用泛型時會拋出錯誤「type *T ispointer to typeparameter, not typeparameter」?

Susan Sarandon
Susan Sarandon原創
2024-11-04 16:46:02317瀏覽

Why Does Go Throw the Error

使用泛型:了解類型參數和約束

本文深入探討了為什麼編譯器錯誤「type *T is point to type argument, not type」的複雜性愛嘗試在Go 中編譯涉及泛型的程式碼時會出現「參數」。

關於類型參數和約束

在 Go 泛型中,類型參數表示滿足指定約束的任何類型的佔位符。值得注意的是,該約束定義了類型參數上可用的操作集,但它並未直接定義從該類型參數派生的任何指標類型的屬性。這是遇到的錯誤訊息的關鍵。

錯誤訊息解釋

錯誤訊息表示 *T 的方法集不會自動包含在具體類型上聲明的指標接收器方法受限制。這意味著,如果約束介面需要指標接收器方法,則具體類型必須使用指標接收器來實現它。

解決問題

在提供的程式碼片段:

  1. 限制:要解決「SetId 方法有指標接收器」錯誤,介面GS 應使用指標接收器定義:
<code class="go">type GS interface {
    Id() string
    (*GS) SetId(string)
}</code>
  1. 實例化: MyStore 實例化應使用*A 而非A:
MyStore 實例化應使用*A 而非A:
<code class="go">var storeA = &MyStore[*A]{}</code>
  1. 方法修改:
將MyStore 中的方法定義更改為使用T 代替*T:
<code class="go">type MyStore[T GS] struct {
    values map[string]T
}

func (s *MyStore[T]) add(item T) {...}</code>

透過進行這些調整,程式碼在語法和語義上變得正確。

以上是為什麼Go在使用泛型時會拋出錯誤「type *T ispointer to typeparameter, not typeparameter」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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