猿问

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

给定一个通用结构:

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


繁花不似锦
浏览 211回答 1
1回答

Qyouu

实例化必须发生在类型级别,而不是方法级别,并且方法不能引入新的类型参数,请参阅如何在 Go 中创建泛型方法?(方法必须没有类型参数)这意味着当你想使用 时R2,你必须为类型参数选择类型参数,而方法不能改变这些,你会“卡住”你在实例化时选择的类型R2。另请注意,由于 for 的约束IDTYPE是comparable,例如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 = rs.Store(context.TODO())fmt.Println(r)哪些输出(在Go Playground上尝试):&{123 false}ID这提供了灵活性(您可以使用为字段设置任何可比较的值setID()),并提供编译时安全性:尝试设置不可比较的值将导致编译时错误,例如:setID(r, []int{1}) // Error: []int does not implement comparable
随时随地看视频慕课网APP

相关分类

Go
我要回答