如何创建一个泛型结构?



如何构建泛型结构?

我试着:

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

gotp Playground: https://gotipplay.golang.org/p/Qyd6zTLdkRn

最新更新