1 回答

TA贡献1786条经验 获得超11个赞
实例化必须发生在类型级别,而不是方法级别,并且方法不能引入新的类型参数,请参阅如何在 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 = r
s.Store(context.TODO())
fmt.Println(r)
哪些输出(在Go Playground上尝试):
&{123 false}
ID这提供了灵活性(您可以使用为字段设置任何可比较的值setID()),并提供编译时安全性:尝试设置不可比较的值将导致编译时错误,例如:
setID(r, []int{1}) // Error: []int does not implement comparable
- 1 回答
- 0 关注
- 210 浏览
添加回答
举报