Метод, принимающий интерфейс в качестве параметра внутри интерфейса - PullRequest
0 голосов
/ 01 мая 2020

Я объявляю интерфейс в go

type comparable interface {
GetKey() float32
Compare(comparable) int

}

и реализую этот интерфейс, создав эту структуру

type Note struct {
id       int
text     string
priority float32

}

func (note Note) GetKey() float32 {
return note.priority

}

func (note Note) Compare(note2 Note) int {
if note.priority < note2.priority {
    return -1
} else if note.priority > note2.priority {
    return 1
} else {
    return 0
}

}

Но когда я передаю объект заметки в функцию, которая принимает сопоставимый интерфейс в качестве параметра, я получаю ошибку «Неправильный тип для сравнения методов» .

Я что-то упускаю или делаю что-то не так? Пожалуйста, помогите

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 01 мая 2020

Вы не используете comparable, так как вы используете Note в методе сравнения, а не comparable. Compare(note2 Note) не совпадает с Compare(comparable).

Используйте comparable в методе сравнения для реализации comaprable интерфейса

func (note Note) Compare(note2 comparable) int {
    if note.GetKey()< note2.GetKey() {
        return -1
    } else if note.GetKey()> note2.GetKey() {
        return 1
    } else {
        return 0
    }
}
3 голосов
/ 01 мая 2020

Вы объявили comparable как имеющий метод с подписью Compare(comparable) int.

Так что func (note Note) Compare(note2 Note) должно быть func (note Note) Compare(note2 comparable), чтобы соответствовать интерфейсу.

В противном случае вы ' не реализует тот же интерфейс. Чтобы реализовать comparable, ваш метод Compare должен принимать любой comparable, но тот, который вы объявили для Note, принимает только Note, и не сопоставим. Это другой метод.

Вот минимальный пример, модифицированный для работы, основанный на вашем коде: https://play.golang.org/p/ajH1s5gbGcQ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...