如何创建通用结构?

Seb*_*sen 5 generics go

如何构建通用结构?

我试过:

type SafeSet[type T] struct {
    Values map[T]bool
}
Run Code Online (Sandbox Code Playgroud)

我希望能够做到例如

SafeSet{ Values: make(map[net.Conn]bool) }
SafeSet{ Values: make(map[string]  bool) }
SafeSet{ Values: make(map[int]     bool) }
Run Code Online (Sandbox Code Playgroud)

bla*_*een 2

当前的 Go 版本 1.17 无法做到这一点。不幸的是,没有什么可说的。

\n
\n

在将泛型添加到语言中之后,可能在 Go 1.18(2022 年初)中,根据当前接受的提案,这种参数化类型的语法将是:

\n
type SafeSet[T comparable] struct {\n    Values map[T]bool\n}\n
Run Code Online (Sandbox Code Playgroud)\n

尤其:

\n
    \n
  • 类型约束位于类型名称之后T
  • \n
  • 如果要用作T映射键,则必须使用内置约束comparable,因为映射键必须是可比较的 \xe2\x80\x94 即支持==运算符。
  • \n
\n

然后,您必须使用实际类型参数实例化参数化类型:

\n

例子:

\n
\n

要使用泛型类型,您必须提供类型参数。这称为实例化。像往常一样,类型参数出现在方括号中。当我们通过为类型参数提供类型参数来实例化类型时,我们会生成一个类型,其中类型定义中类型参数的每次使用都被相应的类型参数替换。

\n
\n
    s0 := SafeSet[net.Conn]{Values: make(map[net.Conn]bool)}\n    s1 := SafeSet[string]{Values: make(map[string]bool)}\n    s2 := SafeSet[int]{Values: make(map[int]bool)}\n
Run Code Online (Sandbox Code Playgroud)\n

由于实例化SafeSet文字看起来有点冗长,因此您可以使用通用构造函数:

\n
func NewSafeSet[T comparable]() SafeSet[T] {\n    return SafeSet[T]{Values: make(map[T]bool)}\n}\n
Run Code Online (Sandbox Code Playgroud)\n

显然,语法是相同的,只是在这种情况下,您使用 arg 类型显式实例化该函数:

\n
    s3 := NewSafeSet[uint64]()\n    s3.Values[200] = true\n
Run Code Online (Sandbox Code Playgroud)\n

Gotip 游乐场:https://gotipplay.golang.org/p/Qyd6zTLdkRn

\n