🏁Александр
если мне память не изменяет, в С++ мы бы уже отхватили
🏁Александр
за такие вольности
🏁Александр
поинтеры есть поинтеры
Vladislav
Омг. И что?
Vladislav
Какую проблему оно создает?
🏁Александр
слишком сладкий сахар, можно диабет подхватить 🙂
🏁Александр
Какую проблему оно создает?
вернемся к примеру:
r := &Rabbit{AbstractAnimal{Name:"Bunny", Gender: true},12}
s := &Snake{AbstractAnimal{Name:"Kaa", Gender: false}, 50}
animals := []AnimalInterface{r,s}
и теперь расскажите мне, при проходе по AnimalInterface у нас там что будет, поинтеры или структуры?
Vladislav
🏁Александр
Sergey
Воспринимай в данном случае интерфейс AnimalInterface как контракт
🏁Александр
а если этот метод пишет в структуру, надо знать мы в поинтере мы или в структуре. Иначе можно что-то испортить, если он случайно в другом месте используетс
Sergey
Если нечто выполняет этот контракт то ок
Vladislav
Sergey
И неважно будет это что-то принтером или нет
Vladislav
Sergey
🏁Александр
так поинтер нихрена не может удолетворять
Vladislav
Почему?
🏁Александр
если только там не "магия" с разименовыванием
Sergey
🏁Александр
потому что поинте блин это ссылка на память (в гоу не так)
Vladislav
Ну офигеть. А мы про что говорим?
Sergey
Vladislav
🏁Александр
мы вот такие тупые, написали что-то такое -
🏁Александр
https://play.golang.org/p/3wARZ1Zhy8U
🏁Александр
обычно такое код после 3 часов ночи начинается 🙂
🏁Александр
и нихрена не подстрахует же
Vladislav
Vladislav
Так можно любой код с ошибкой написать и "нихрена не подстрахует же"
Oleksandr
скажите, а использовать reflect для решения такой задачи - негодно?
https://play.golang.org/p/nQ2v8lY6cqD
в принципе всё работает
радует то что не нужно будет для каждого поля писать getter, но кажется как-то избыточно
Nurzhan
Чем интерфейс не устраивает?)
Aleksandr
Oleksandr
потому что написать один GetName() это ещё норм, но написать для 20-30 полей - уже выходят простыни
Aleksandr
https://dave.cheney.net/2013/06/30/how-to-write-benchmarks-in-go
Aleksandr
бенчи в го делать просто
Vladislav
🏁Александр
у него там зоопарк
🏁Александр
я предложил через type switch
🏁Александр
но он хочет универсальный
Vladislav
Так вы уверены, что вам нужны все?
Oleksandr
всё верно - хочу универсальный, и чтобы в случае редактирования мне надо было менять в одном месте, а не в нескольких;
не все, - те которые в С++ я бы пометил как public
как разделять в принципе понятно
Vladislav
Почему не так https://play.golang.org/p/5fbuPi5sDy5?
Nurzhan
а так?
https://play.golang.org/p/mkYuwx_CU_M
Oleksandr
потому что за каждым полем придётся создавать ещё и getter
Nurzhan
,kby
Nurzhan
блин, то же самое)
Oleksandr
угу,
ну я вроде понял - reflect решает, но при этом получаем просадку производительности, что нивелирует одно из основных преимуществ go
🏁Александр
🏁Александр
вы что-то делаете не так, если он вам нужен
🏁Александр
в гоу приято все писать "руками"
Vladislav
Либо делаете анмаршалер.
Anonymous
Vladislav
Да.
Vladislav
В анмаршале самое место.
Anonymous
🏁Александр
Не правда :)
первые пол года разработки, правда! 🙂
Vladislav
Ну и подобных случаях.
Anonymous
первые пол года разработки, правда! 🙂
Вот, было не так давно. Есть у меня конфиг в yaml, в нем есть опция, и параметр может быть либо строкой, либо массивом строк. Самое место для reflect ))
🏁Александр
нет
🏁Александр
interface{} туда
Nikita
И тайп-свитч
🏁Александр
потом type switch
Vladislav
Anonymous
уже не помню что %)
Vladislav
Anonymous
Vladislav
Ну и поставите там скобки, все-го то.
Nurzhan
TIMTOWTDI :)
Vladislav
Зато сразу видно что можно много передать.
Anonymous
там выбор был между:
foo: bar
или
foo:
- bar
Anonymous
ИМХО, первый вариант читабельней
Vladislav
Но в первом неочевидно, что можно много.
Anonymous
это очевидно из "контекста" самого конфига
Vladislav
Еще есть один хак. Ща нарисую.