1 回答
TA貢獻1873條經驗 獲得超9個贊
您無法在當前的 Go 版本 1.17 中執行此操作。不幸的是,沒有別的可說的了。
在泛型將被添加到語言中之后,可能在Go 1.18(2022年初)中,根據當前接受的提案,這種參數化類型的語法將是:
type SafeSet[T comparable] struct {
Values map[T]bool
}
特別:
類型約束位于類型名稱之后T
如果要用作映射鍵,則必須使用內置約束 ,因為映射鍵必須具有可比性,即支持運算符。Tcomparable==
然后,您必須使用實際類型參數實例化類型:
例:
若要使用泛型類型,必須提供類型參數。這稱為實例化。像往常一樣,類型參數顯示在方括號中。當我們通過為類型參數提供類型參數來實例化類型時,我們將生成一個類型,其中類型定義中類型參數的每次使用都將替換為相應的類型參數。
s0 := SafeSet[net.Conn]{Values: make(map[net.Conn]bool)}
s1 := SafeSet[string]{Values: make(map[string]bool)}
s2 := SafeSet[int]{Values: make(map[int]bool)}
由于實例化文本看起來有點冗長,因此您可以使用泛型構造函數 func:SafeSet
func NewSafeSet[T comparable]() SafeSet[T] {
return SafeSet[T]{Values: make(map[T]bool)}
}
顯然,語法是相同的,除了在這種情況下,您使用arg類型顯式實例化函數:
s3 := NewSafeSet[uint64]()
s3.Values[200] = true
戈蒂普 游樂場: https://gotipplay.golang.org/p/Qyd6zTLdkRn
- 1 回答
- 0 關注
- 100 瀏覽
添加回答
舉報
