我如何構建一個通用結構?
我試過:
type SafeSet[type T] struct {
值 map[T]bool bool ?
}
我希望能夠做到例如
我希望能夠做到例如
SafeSet{ Values: make(map[net.Conn]bool) }
SafeSet{ 值。make(map[string] bool) }
SafeSet{ 值。make(map[int] bool) }
uj5u.com熱心網友回復:
在當前的Go版本1.17中,你不能這樣做。不幸的是,沒有其他可說的了。
在泛型將被添加到語言中之后,可能是在Go 1.18(2022年初),根據目前接受的建議,這種引數化型別的語法將是:
type SafeSet[T comparable] struct {
值 map[T]bool
}
特別是:
- 型別約束是在型別名稱
T之后。
- 如果你想使用
T作為一個映射鍵,你必須使用內置的約束comparable,因為映射鍵必須是可比較的--即支持==操作。
然后你必須用一個實際的型別引數來實體化引數化型別:
示例:
要使用通用型別,你必須提供型別引數。這被稱為實體化。像往常一樣,型別引數出現在方括號中。當我們通過為型別引數提供型別引數來實體化一個型別時,我們會產生一個型別,其中型別定義中的每個型別引數的使用都被相應的型別引數所取代。
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)}
由于實體化SafeSet欄位看起來有點冗長,你可以使用一個通用的建構式func:
func NewSafeSet[T comparable]() SafeSet[T] /span> {
return SafeSet[T]{Values: make(map[T]bool) }
}
語法顯然是相同的,只是在這種情況下,你明確地用arg型別實體化函式:
語法是相同的。
s3 := NewSafeSet[uint64] ()
s3.Values[200] =true
Go2游樂場。https://go2goplay.golang.org/p/Qyd6zTLdkRn
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/318617.html
標籤:
