为了账号安全,请及时绑定邮箱和手机立即绑定

如何创建通用结构?

如何创建通用结构?

Go
Smart猫小萌 2022-09-26 20:04:53
如何构造泛型结构?我试过了: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) }
查看完整描述

1 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

您无法在当前的 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:SafeSet


func 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


查看完整回答
反对 回复 2022-09-26
  • 1 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号