首頁 > 後端開發 > Golang > 在 Go 泛型中使用混合型別約束時如何避免 IncompleteAssign 錯誤?

在 Go 泛型中使用混合型別約束時如何避免 IncompleteAssign 錯誤?

Patricia Arquette
發布: 2024-12-28 10:21:10
原創
666 人瀏覽過

How to Avoid IncompatibleAssign Errors When Using Mixed Type Constraints in Go Generics?

管理具有混合值約束的泛型類型中的不相容分配錯誤

在Go 中,泛型允許創建對其字段具有特定約束的類型。但是,在約束中混合不同類型群組時,將值文字指派給結構體欄位可能會導致 IncompleteAssign 錯誤。

考慮以下範例:

type constraint interface {
    ~float32 | ~float64
}

type foo[T constraint] struct {
    val T
}

func (f *foo[float64]) setValToPi() {
    f.val = 3.14
}
登入後複製

此程式碼將文字 3.14 指派給 val foo[float64] 類型的欄位。這是可以接受的,因為 3.14 是有效的 float64 值。

但是,當約束擴展到包含int 類型時,會出現錯誤:

type constraint interface {
    ~float32 | ~float64 | ~int
}

type foo[T constraint] struct {
    val T
}

func (f *foo[float64]) setValToPi() {
    f.val = 3.14 // IncompatibleAssign: cannot use 3.14 (untyped float constant) as float64 value in assignment
}
登入後複製
此錯誤源自方法宣告:

func (f *foo[float64]) setValToPi() {
    // ...
}
登入後複製
這裡,float64 被視為類型參數名稱而不是預期的約束。因此,編譯器無法確定 val 欄位的特定類型,也無法驗證 3.14 是否與所有可能的約束實例相容。

要解決此問題,必須使用通用方法參數來接受值類型參數類型改為:

func (f *foo[T]) SetValue(val T) {
    f.val = val
}
登入後複製
此解決方案可防止分配像3.14 這樣的固定值,這在這裡種情況下是不適當的做法。替代方法包括使用 any/interface{} 作為欄位類型。

以上是在 Go 泛型中使用混合型別約束時如何避免 IncompleteAssign 錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板