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

我在 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)。


有什么问题的想法吗?


繁花不似锦
浏览 97回答 1
1回答

慕莱坞森

我相信这是此处描述的错误: 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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go