首頁 >後端開發 >Golang >使用指向類型參數的指標建立泛型類型的實例

使用指向類型參數的指標建立泛型類型的實例

WBOY
WBOY轉載
2024-02-09 13:57:201072瀏覽

使用指向類型參數的指標建立泛型類型的實例

php小編魚仔在這篇文章中將介紹如何使用指向型別參數的指標來建立泛型類型的實例。泛型是一種在程式設計中廣泛應用的概念,它允許我們在不指定具體類型的情況下編寫通用的程式碼。在php中,雖然沒有原生支援泛型的功能,但我們可以透過使用指向類型參數的指標來模擬實作泛型。這種方法可以讓我們在編寫程式碼時更加靈活和高效,提高程式碼的複用性和可維護性。在接下來的內容中,我們將詳細介紹如何使用這種方法來建立泛型類型的實例,並給出一些實際應用的範例。

問題內容

給定這些類型定義:

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

type s[t any] struct {
    t t
}

type myint int

type pspmyint[t myint] *s[*t]
type spmyint[t *myint,] s[t]
type spmyint2[t myint] s[*t]

我可以建立 type pspmyint 的 var

#
func createps[t myint]() pspmyint[t] {
    var i t
    s := s[*t]{t: &i}
    return &s
}

但我不知道如何建立 spmyintspmyint2 的變數。

這個

func createSP[T myInt]() spMyInt2[T] {
    var i T
    s := S[*T]{t: &i}
    return s
}

編譯失敗 不能在return語句中使用s(s[*t]類型的變數)作為spmyint2[t]型別。

解決方法

首先,不要使用精確型別參數限制。這幾乎沒有任何意義。當您將函數宣告為createps[t myint]() 時,類型參數類型集的基底數為1,因此可以有效地由myint 實例化永遠。您可以像下面這樣重寫該函數:

65蜜蜂32705632

解決這個問題:

類型 s[*t] spmyint2[t] 不同。但是,由於 spmyint2[t] 的底層類型是 s[*t],因此您可以簡單地轉換:

65蜜蜂32705638

至於 type spmyint[t *myint,] s[t] (其中逗號不是拼字錯誤,但需要避免解析歧義),事情並不那麼簡單。

問題在於型別參數不是其型別約束。因此,類型文字不能用於實例化不同的未命名類型文字。需要明確的是:

// naive attempt that doesn't compile
func createsp1[t myint]() spmyint[*t] {
    var i t
    s := s[*t]{t: &i}
    return spmyint[*t](s)
}

您可能認為spmyint[t *myint] 有一個類型參數約束為*myint 且函數t 受基本型別myint 約束,因此 *t 應該滿足phpcnc phpcnt * myint。這是不正確的,因為類型文字 *t 不等於 *myint 的明顯不明顯的原因。所以實際上你不能為 type spmyint[t *myint,] s[t] 寫一個通用建構子。

但是你很幸運,因為類型限制的基數為一。所以你可以刪除類型參數:

func createSP1() spMyInt[*myInt] {
    var i myInt
    s := S[*myInt]{t: &i}
    return spMyInt[*myInt](s)
}

以上是使用指向類型參數的指標建立泛型類型的實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除