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

函数调用中的类型参数恐慌

函数调用中的类型参数恐慌

Go
繁花不似锦 2023-01-03 14:04:54
我在 Go 中有一个结构,它代表一个状态。我现在希望能够比较两个状态(当前和期望),从而将每个字段与另一个字段进行比较。如果所有字段都“相等”,我将两个状态定义为“相等”。但是,在某些情况下,字段相等性相当松散,我想自定义定义。假设“RestartedAfter”中的状态字段之一。如果当前状态 RestartedAfter 大于期望状态 RestartedAfter,那么我认为两者“相等”。在示例中我只使用了一个字段,但由于我想遍历结构的所有字段(在下一步中),我考虑使用类型参数来定义一个AssertEqual()接口,状态结构中的所有字段都应该实现.type StateField[T any] interface {    AssertEqual(T) error}type RestartedAfter intfunc (current RestartedAfter) AssertEqual(desired RestartedAfter) error {    if current >= desired {        return nil    }    return errors.New("current RestartedAfter happened before desired RestartedAfter")}func compareTwo[T any](x StateField[T], y T) error {    return x.AssertEqual(y)  // panics}func main() {    r1 := RestartedAfter(1)    r2 := RestartedAfter(2)    err := compareTwo[RestartedAfter](r1, r2)    if err != nil {        os.Exit(1)    }}然而,这个例子会引起恐慌。我收到以下消息:panic: interface conversion: main.StateField[go.shape.int_0] is main.RestartedAfter, not main.RestartedAfter (types from different scopes)。有什么问题的想法吗?
查看完整描述

1 回答

?
慕莱坞森

TA贡献1810条经验 获得超4个赞

我相信这是此处描述的错误: https ://github.com/golang/go/issues/53376

要修复当前版本,您可以重新分配变量:

func compareTwo[T any](x StateField[T], y T) error {
    a := x
    b := y    
    return a.AssertEqual(b)
}

它在最新的开发分支中没有修复就可以工作: https ://go.dev/play/p/KAPDHQW8RWH?v=gotip


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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信