繁体   English   中英

如何创建通用结构?

[英]How to create a generic struct?

如何构建通用结构?

我试过:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM