我在Go中有一个struct,它代表一个状态.现在,我希望能够比较两种状态(当前和所需),

假设"RestartedAfter"中的一个state字段.如果当前状态重启后大于所需状态

在这个例子中,我只使用一个字段,但由于我想迭代 struct 的所有字段(在下一步中),

type StateField[T any] interface {
    AssertEqual(T) error
}

type RestartedAfter int

func (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 .我收到以下信息:panic: interface conversion: main.StateField[go.shape.int_0] is main.RestartedAfter, not main.RestartedAfter (types from different scopes).

你知道怎么了吗?

推荐答案

我相信这是这里描述的一个bug:

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

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

它在最新开发分支中没有修复:

Go相关问答推荐

Go GORM创建表,但不创建列

GORM Find(&;Room)操作使用空数据而不是实际数据填充 struct

为什么(编码器).EncodeElement忽略";,innerxml";标记?

使用Go使用Gorm使用外键对数据进行排序

Docker Compose Health Check未退出,错误为无法启动

埃拉托塞尼筛:加快交叉关闭倍数步骤

Kafka golang 生产者在错误后更改分区计数

Go 中的 protobuf FieldMask 解组

使用GOTK3和librsvg在Go中如何加载内联SVG?

Go 中如何调用测试函数?

访问传递给可变参数函数的通用 struct 的特定字段

GRPC 元数据未在 Go 中更新

Golang 工作池实现意外工作

使用反射在 struct 内迭代切片 struct

如果服务器在客户端的 gRPC 中不可用,则等待的方法

golang jwt.MapClaims 获取用户ID

通用函数与外部包中的常见成员一起处理不同的 struct ?

Go lang - 惯用的默认后备

golangci-lint 的 GitHub 操作失败,无法加载 fmt

获取单调时间,同 CLOCK_MONOTONIC