猿问

如何创建通用结构?

如何构造泛型结构?


我试过了:


type SafeSet[type T] struct {

    Values map[T]bool

}

我希望能够做到例如


SafeSet{ Values: make(map[net.Conn]bool) }

SafeSet{ Values: make(map[string]  bool) }

SafeSet{ Values: make(map[int]     bool) }


Smart猫小萌
浏览 93回答 1
1回答

眼眸繁星

您无法在当前的 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:SafeSetfunc 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
随时随地看视频慕课网APP

相关分类

Go
我要回答