2016-01-30 3 views
5

Я недавно начал изучать Go и столкнулся с следующей проблемой. Я хочу реализовать интерфейс Comparable. У меня есть следующий код:Как реализовать сопоставимый интерфейс в go?

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 ,

Возможно, я что-то пропустил или не понял, но можно ли это сделать?

ответ

3

Ваш интерфейс требует метод

compare(Comparable) int

но вы реализовали

func (item T) compare(other T) int { (другой T вместо другого сопоставимого)

вы должны сделать что-то вроде этого:

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 
} 
+1

Отлично! Спасибо! –

+0

Возможно, вы сделали двойную диапатчику вместо утверждения типа –

+0

@Ezequiel Moreno Можете ли вы отправить пример, пожалуйста? –

Смежные вопросы