我在 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
- 1 回答
- 0 关注
- 95 浏览
添加回答
举报
0/150
提交
取消