【问题标题】:How can I implement comparable interface in go?如何在 go 中实现可比较的接口?
【发布时间】:2016-05-08 04:57:05
【问题描述】:

我最近开始学习 Go 并面临下一个问题。我想实现 Comparable 接口。我有下一个代码:

type Comparable interface {
    compare(Comparable) int
}
type T struct {
    value int
}
func (item T) compare(other T) int {
    if item.value < other.value {
        return -1
    } else if item.value == other.value {
        return 0
    }
    return 1
}
func doComparison(c1, c2 Comparable) {
    fmt.Println(c1.compare(c2))
}
func main() {
    doComparison(T{1}, T{2})
}

所以我遇到了错误

cannot use T literal (type T) as type Comparable in argument to doComparison:
    T does not implement Comparable (wrong type for compare method)
        have compare(T) int
        want compare(Comparable) int

我想我理解T 没有实现Comparable 的问题,因为比较方法将T 作为参数而不是Comparable

也许我错过了什么或不明白,但有可能做这样的事情吗?

【问题讨论】:

    标签: go go-interface


    【解决方案1】:

    你的接口需要一个方法

    compare(Comparable) int

    但是你已经实现了

    func (item T) compare(other T) int {(其他 T 而不是其他 Comparable)

    你应该这样做:

    func (item T) compare(other Comparable) int {
        otherT, ok := other.(T) //  getting  the instance of T via type assertion.
        if !ok{
            //handle error (other was not of type T)
        }
        if item.value < otherT.value {
            return -1
        } else if item.value == otherT.value {
            return 0
        }
        return 1
    }
    

    【讨论】:

    • 你可能做了双重diapatch而不是类型断言
    • @Ezequiel Moreno 你能发布示例吗?
    • 对于那些不赞成投票的人,我的错误是什么?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    相关资源
    最近更新 更多