首頁 > 後端開發 > Golang > 主體

Go 泛型:無效的複合文字

王林
發布: 2024-02-08 22:00:11
轉載
1138 人瀏覽過

Go 泛型:无效的复合文字

php小編西瓜為您帶來了最新的資訊-「Go 泛型:無效的複合文字」。在Go語言社群中,泛型一直是備受關注的議題。隨著Go 1.18版本的發布,泛型將正式納入Go語言的標準函式庫。然而,這項決定並不是所有人都能接受的。本文將探討泛型在Go語言中的實現方式以及相關的爭議和討論,幫助讀者更好地理解這項技術,並為其在實際開發中的應用提供參考。

問題內容

以下程式碼會導致錯誤「無效的複合文字類型 t」。

package main

import "fmt"

func main() {
    fmt.Println(createThing[foo]())
}

type thing interface {
    foo | bar
}

type foo struct {
    id int
    a  string
}

type bar struct {
    id int
    b  int
}

func createThing[T thing, P *T]() P {
    return &T{}
}
登入後複製

如果我只在介面thing中包含thing#,或刪除a stringb int,那麼foo bar完全相同,程式碼將運行沒有錯誤。然而,這是否違背了泛型的目的?為什麼我不能實例化這樣的泛型類型,尤其是當我什至沒有訪問任何字段時?

可能與 https://github.com/golang/go/issues/48522 相關

解決方法

大多數泛型類型對於複合文字來說不是有效類型。但這不是問題,因為還有其他方法可以建立泛型類型的值。

建立指向新零值的指標:

func creatething[t thing]() *t {
    return new(t)
}
登入後複製

或建立一個非指標零值:

func createThing[T thing]() T {
    var value T
    return value
}
登入後複製

至於為什麼以這種方式發生錯誤,這裡是規範中的解釋,經過修改以解決您的特定問題。

對於複合文字

literaltype 的核心類型 t 必須是結構體、陣列、切片或映射類型

核心類型是什麼?

介面 t 具有核心類型,如果 [...] 存在單一類型 u,它是 t 類型集中所有類型的基礎類型

沒有其他介面具有核心類型。

底層型別是什麼?

每個類型 t 都有一個基礎類型:如果 t 是預先宣告的布林、數字或字串類型之一,或類型文字,則對應的基礎類型是 t 本身。否則,t 的基礎類型是 t 在其聲明中引用的類型的基礎類型。

「類型文字」可以指文字結構類型,例如 struct{int id}。因此,當foobar 都具有struct{int id}底層類型時,則thing具有struct{int id}核心型別,因此複合文字是可能的。當 foobar 沒有相同的底層類型時,則 thing 沒有核心類型,並且複合文字是不可能的,因此您的錯誤。

正式的定義可能看起來很複雜,但結果和實際要點很簡單:泛型程式碼只能表達可能類型的常見行為。除了在所有基礎類型都相同的特殊情況下,文字值並不是常見的行為。

以上是Go 泛型:無效的複合文字的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!