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

无法将未类型化的 int 分配给通用结构字段

无法将未类型化的 int 分配给通用结构字段

Go
繁花不似锦 2023-02-14 15:26:50
给定一个通用结构:type R2[IDTYPE comparable] struct {     ID        IDTYPE     IsActive  bool}实现接口:type Storable interface {     Store(ctx context.Context) error}我希望以下定义有效:func (r R2[int]) Store(ctx context.Context) error {     r.ID = 123 // not allowed     // ...     return nil}但是,方法定义是不允许的。错误是:'123' (type untyped int) cannot be represented by the type IDTYPE (int)在 Go 中还不能进行这种通用字段分配吗?附录:在游乐场上,错误是:cannot use 123 (untyped int constant) as int value in assignment并转换为int(123)不起作用。这种情况下的错误是:cannot use comparable(123) (untyped int constant 123) as int value in assignment
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

实例化必须发生在类型级别,而不是方法级别,并且方法不能引入新的类型参数,请参阅如何在 Go 中创建泛型方法?(方法必须没有类型参数)

这意味着当你想使用 时R2,你必须为类型参数选择类型参数,而方法不能改变这些,你会“卡住”你在实例化时选择的类型R2

另请注意,由于 for 的约束IDTYPEcomparable,例如string,整数123不能在所有情况下分配给该ID字段,因为它可能具有类型string

如果您想要/必须为 ID 处理多个具体类型,泛型不是正确的选择。可以改用接口:

type R2 struct {

    ID       any

    IsActive bool

}

另请注意,如果您希望修改接收器(例如结构的字段),则接收器必须是指针。


ID如果您希望限制存储在to中的值comparable,请为其使用(通用)函数。


以下是您的操作方法:


type R2 struct {

    ID       any

    IsActive bool

}


func (r *R2) Store(ctx context.Context) error {

    setID(r, 123)

    return nil

}


func setID[ID comparable](r *R2, id ID) {

    r.ID = id

}

测试它:


r := &R2{}

var s Storable = r


s.Store(context.TODO())


fmt.Println(r)

哪些输出(在Go Playground上尝试):


&{123 false}

ID这提供了灵活性(您可以使用为字段设置任何可比较的值setID()),并提供编译时安全性:尝试设置不可比较的值将导致编译时错误,例如:


setID(r, []int{1}) // Error: []int does not implement comparable


查看完整回答
反对 回复 2023-02-14
  • 1 回答
  • 0 关注
  • 210 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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