如何构建通用结构?
我试过:
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) }
你不能用当前的 Go 版本 1.17 做到这一点。不幸的是,没有什么可说的。
在将泛型添加到语言中之后,可能在 Go 1.18(2022 年初)中,根据当前接受的提案,这种参数化类型的语法将是:
type SafeSet[T comparable] struct {
Values 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] {
return SafeSet[T]{Values: make(map[T]bool)}
}
显然,语法是相同的,只是在这种情况下,您显式实例化了类型为 arg 的函数:
s3 := NewSafeSet[uint64]()
s3.Values[200] = true
Go2 游乐场:https ://go2goplay.golang.org/p/Qyd6zTLdkRn
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句