我在 Go 中有一个结构,它代表一个状态。我现在希望能够比较两个状态(当前和期望),从而将每个字段与另一个字段进行比较。如果所有字段都“相等”,我将两个状态定义为“相等”。但是,在某些情况下,字段相等性相当松散,我想自定义定义。
假设“RestartedAfter”中的状态字段之一。如果当前状态 RestartedAfter 大于期望状态 RestartedAfter,那么我认为两者“相等”。
在示例中我只使用了一个字段,但由于我想遍历结构的所有字段(在下一步中),我考虑使用类型参数来定义一个AssertEqual()接口,状态结构中的所有字段都应该实现.
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: interface conversion: main.StateField[go.shape.int_0] is main.RestartedAfter, not main.RestartedAfter (types from different scopes)。
有什么问题的想法吗?
慕莱坞森
相关分类