Nurzhan
Если то, что собираешься сделать, не будет меняется, то лучше интерфейс заточенный под это действие наверное
Andrei 🦉
Andrei 🦉
а по вашему вопросу - определите единый интерфейс для ваших структур и работайте уже со слайсом, содержащим объекты с данным интерфейсом
Nikita
Oleksandr
о, у меня почти также получилось - но здесь даже лаконичнее;
спасибо
🏁Александр
фаг не успел 🙁
🏁Александр
тоже готовил пример и опять затупил
🏁Александр
https://play.golang.org/p/S9a8pWN9e1j
🏁Александр
"Snake does not implement AnimalInterface" бред какой
Nikita
Oleksandr
начинает работать когда убираю указатель
🏁Александр
а что интерфейсы не работаю без звездочки?
🏁Александр
в смысле С звездочкой, не работают
Andrei 🦉
ты в массив пихаешь структуры
Andrei 🦉
а не поинтеры на них
Andrei 🦉
а метод определяешь для поинтера
Nikita
а что интерфейсы не работаю без звездочки?
Открываю большую тайну. Итак, у нас есть интерфейс. У структуры можно определить метод по значению и по ссылке. Если метод определен по указателю и у нас _указатель_на_структуру_, то он удовлетворяет интерфейсу, если метод по значению и у нас структура по значению, _тоже_удовлетворяет_
Nikita
в противных случаях - нет
Andrei 🦉
🏁Александр
https://play.golang.org/p/HL5e-82ji5g
🏁Александр
ну так работает конечно
🏁Александр
но ошибка конечно "тупая"
🏁Александр
можно было не орать что ""Snake does not implement", а написать что ты не указатель подсовываешь
🏁Александр
оно автоматические вроде только для методов, а не для атрибутов структуры
🏁Александр
странно кстати что слайс выглядит как - animals := []AnimalInterface{r,s}
🏁Александр
а не animals := []*AnimalInterface{r,s}
🏁Александр
мы же храним там фактически указатели
Nikita
🏁Александр
r и s это ссылка на память фактически, должны кормить в []*AnimalInterface{r,s} по хорошему
Nikita
🏁Александр
если мы попробуем таким же финтом хранить кроликов
🏁Александр
r1 := &Rabbit{AbstractAnimal{Name:"Bunny", Gender: true},12}
r2 := &Rabbit{AbstractAnimal{Name:"Bunny", Gender: true},12}
animals := []Rabbit{r1, r2}
🏁Александр
то нас пошлют в эротические
🏁Александр
что правильно
🏁Александр
ничего им не мешало проверить еще и "соседа"
🏁Александр
ибо первый аргумент они сами подсовывают
🏁Александр
ну проверьте вдруг разработчик накосячил
Alexander
да, ошибка типичная и её компилятор мог бы обработать отдельно и показать более точное сообщение об ошибке. Тут я согласен.
Vladislav
method has pointer receiver
🏁Александр
мне вот не понятно, каким хреном поинтер соотвествует интерфейсу
Vladislav
В смысле?
🏁Александр
r := &Rabbit{AbstractAnimal{Name:"Bunny", Gender: true},12}
s := &Snake{AbstractAnimal{Name:"Kaa", Gender: false}, 50}
animals := []AnimalInterface{r,s}
🏁Александр
когда должно быть
🏁Александр
animals := []*AnimalInterface{r,s}
Vladislav
Почему?
🏁Александр
мы же коллекцию поинтеов определенного интерфейса храним
Vladislav
Мы храним коллекцию интерфейсов.
Vladislav
Поинтеры там или нет пофиг.
🏁Александр
это для interface{} справедливо было бы
🏁Александр
но мы то храним специфически интерфейсы
Vladislav
И что?
🏁Александр
а кормим туда поинтеры
Vladislav
Мы можем и не поинтеры кормить.
🏁Александр
Есть полка с книгами, а мы туда карточек напихали "книга лежит на полке №3"
🏁Александр
каким образом это соотвествует определению "книга"
🏁Александр
это "ссылка на книгу"
🏁Александр
поэтому мы должны определится, это картотека карточек или полка с книгами 🙂
🏁Александр
нельзя пихать в картотеку книги, в на полку карточки
Vladislav
Полка с книгами - это какой интерфейс?
🏁Александр
эти слайз, у него указан в типе BookInterface
Vladislav
Если читать, то карточки не соответствуют и их нельзя туда.
Vladislav
Если только получить имя, то в карточке оно указано и целям удовлетворяет.
🏁Александр
причем если без интерфейсов, это работает правильно
🏁Александр
r1 := &Rabbit{AbstractAnimal{Name:"Bunny", Gender: true},12}
r2 := &Rabbit{AbstractAnimal{Name:"Bunny", Gender: true},12}
animals := []Rabbit{r1, r2}
🏁Александр
вот за такое стойбище кроликов, нам по рукам надают
🏁Александр
поинтеры кормим, где надо структуру
🏁Александр
но как только мы начинаем использовать там интерфейсы - пошло все нахрен, сказал компилятор
🏁Александр
и забыл про проверку
Vladislav
Так взаимодействие с ними разное.
Vladislav
Интерфейсы - не структуры и работают с ними по другому.
🏁Александр
интерфейс это тип, начнем с этого
🏁Александр
поинтер это другой тип
🏁Александр
как можно один тип в другой запихнуть?
Vladislav
А структура - это третий.
Vladislav
Какие с этим проблемы. Просто сделан синтаксический сахар, что не надо делать приведение типов.