Daniel
при компиляции есть всегда конкретный метод, который будет вызван
Мерль
ничего не понял что это такое и зачем это нужно. Если вы хотите сказать что петон лучше чем Го подходит для целей десктопа, то я не согласен с вами категорически. Разве что для хелувордных задач, которые хоть на баше решай.
я вот сейччас пишу десктопный клиент для прода на go и это пиздец Мне впервые за полтора месяца постоянно нужны дженерики, динамический каст просто убивает
Yura
при компиляции есть всегда конкретный метод, который будет вызван
При компиляции вызова метода интерфейса Go вставляет косвенный вызов по поинтеру, хранящемуся в виртуальной таблице по офсету.
Daniel
это да. но нам-то что до этого?
Daniel
не полезем же мы в эту таблицу
Daniel
так что ее, считай, нет
Yura
не полезем же мы в эту таблицу
Ты и в C++ не полезешь. А она есть.
Daniel
в с++ у меня есть средства туда лезть. можно вызвать метод родителя, к примеру.
Daniel
а в go - нет, нетути
Kirya
да, не понятно чем десктоп отличается, от веба, например
Kirya
если логика всегда должна отдельно лежать
Pawel
а в go - нет, нетути
и ещё в го не надо перечислять интерфейсы, которые реализует тип. В джаве от этого хочестся убится апстенку
Pawel
и в C#-е
Yura
а в go - нет, нетути
В C++ вызов метода родителя - тоже статический вызов, и не имеет отношения к виртуальной таблице.
Daniel
коллега, о чем вы?
Daniel
давайте к началу вернемся
Мерль
а зачем динамический каст именно в десктопе на Го? и дженерики
Динамический каст нуже чтобы протаскивать зависимости в контексте в хендлеры по сравнению с вебом на десктопном клиенте в, скажем так, хэндлер приходится (хотя и не хочется) протаскивать очень большое количество разных зависимостей, результат довольно уродлив так же очень большое количество однотипных операций над коллекциями объектов, которые не сводятся к единым интерфейсам, приходится писать кучу имплементаций скажем множеств
Pawel
В C++ вызов метода родителя - тоже статический вызов, и не имеет отношения к виртуальной таблице.
если метод виртуальный, то его вызов не может бытиь статическим
Yura
если метод виртуальный, то его вызов не может бытиь статическим
Конструкция "позвать метод родителя" требует указания типа родителя в C++. Это статический вызов.
Daniel
> Я попросил написать цепочку из трех виртуальных вызовов на Go. Хочу посмотреть, как это будет выглядеть. Можешь? я бы хотел эту цепочку увидеть на любом другом языке
Daniel
чтобы понять, в чем, собственно, вопрос
Мерль
Любом? Я уже написал на питоне выше.
В go это невозможно так как нет наследования ваш кэп )
Yura
В go это невозможно так как нет наследования ваш кэп )
В Go есть множественное наследование (через вложение безымянных элементов). Но нет наследования+виртуальные методы.
Daniel
это не наследование
Daniel
это синтаксический сахар для полей и вызова их методов
Yura
это не наследование
Это не отличимо от наследования без виртуальных методов.
Daniel
еще как отличимо
Yura
Как не назови, но это одно и тоже.
Daniel
возможно, тут и есть камень преткновения
Yura
Назови отличие.
Pawel
В go это невозможно так как нет наследования ваш кэп )
вопрос в другом - нафига это вообще, какую конкретно задачу решает и почему её принципиально нельзя в Го решить по мнению юзера телеграмм
Мерль
у меня тоже много зависимостей. Не вижу как это решается темплейтами C++. Наоборот в Го удобно делать для локализации зависимостей маленькие пакеты с узкими интерфейсами. А множество - это же map[A]bool, нет?
причём тут узкие интерфейсы? Как узкие интерфесы помогают избежать работы с пустыми интерфейсами в контекстах? множество — это map[type]struct{} + методы join-ов и получения слайса и так штук десять писать
Daniel
или генерировать
Мерль
ага либо пистаь руками либо писать генератор для них
Yura
В go это невозможно так как нет наследования ваш кэп )
В C тоже "нет наследования". Однако это не мешало написать объектный GTK с наследованием и виртуальными методами.
Мерль
ага либо пистаь руками либо писать генератор для них
короче заниматься всякой мутью и бодаться с языком вместо решения бизнес задач
Yura
Чтобы не было не доразумений: я люблю Go. Но любить - это принимать недостатки.
Pawel
причём тут узкие интерфейсы? Как узкие интерфесы помогают избежать работы с пустыми интерфейсами в контекстах? множество — это map[type]struct{} + методы join-ов и получения слайса и так штук десять писать
это такой архитектурный ход, когда указываются только те методы, которые использует пакет. Чтобы связность между пакетами свести к минимуму Про пустой контекст не понял - почему он возникает в десктопных аппах с множетвом зависимостей и как это решается темплейтами в С++?
Daniel
Назови отличие.
отличие только одно - в разграничении области видимости.
Pawel
а на каком языке надо писать?
В Го можно распараллелить работу на юниоров. Благодаря концлагерю проще кодеревью и меньше вероятность не выявленных багов.
Daniel
и меньше кода надо в голове держать для кодревью
Pawel
Чтобы не было не доразумений: я люблю Go. Но любить - это принимать недостатки.
а я не люблю Го. Но С++ не люблю ещё больше. Хотелось бы всё таки понять, что именно в твоём примере решается, что нельзя решить в Го
Мерль
это такой архитектурный ход, когда указываются только те методы, которые использует пакет. Чтобы связность между пакетами свести к минимуму Про пустой контекст не понял - почему он возникает в десктопных аппах с множетвом зависимостей и как это решается темплейтами в С++?
он возникает потому что единственный способ прокидывать зависимости вл фреймворке без глобальных переменных во множество хендлеров — это использовать какое-то обобщённое хранилище зависимостей и состояния, это либо context.Context, либо какая-нибудь map[string]interface{} Попробуйте написать развесистое приложение с большим количеством команд и подкоманд — и гарантированно окажетесь в ситуации, когда у вас есть 100500 геттеров и сеттеров для каждой зависимости в контексте. Дженерики — это не темплейты. Темплейты — это не дженерики. Мир станет лучше, когда люди запомнят это )
Yura
отличие только одно - в разграничении области видимости.
~И чем же разграничение в Go отличается от наследования без виртуальных методов?~ Я отменяю вопрос. Мне надоела дискуссия.
Мерль
а на каком языке надо писать?
как ни странно я для себя понял что для десктопа бооьшие приложения я предпочёл бы писать на джабке всё равно когда у тебя появляются касты из interface{} и методы типа Equals методы для ошибок (потому что на обработку ошибок завязано много логики) го превращается в такую вот громоздкую джабку только с большим количеством проверок в рантайме
Pawel
он возникает потому что единственный способ прокидывать зависимости вл фреймворке без глобальных переменных во множество хендлеров — это использовать какое-то обобщённое хранилище зависимостей и состояния, это либо context.Context, либо какая-нибудь map[string]interface{} Попробуйте написать развесистое приложение с большим количеством команд и подкоманд — и гарантированно окажетесь в ситуации, когда у вас есть 100500 геттеров и сеттеров для каждой зависимости в контексте. Дженерики — это не темплейты. Темплейты — это не дженерики. Мир станет лучше, когда люди запомнят это )
== Дженерики — это не темплейты. Темплейты — это не дженерики. Мир станет лучше, когда люди запомнят это ) Согласен, но мы же говорим о нативных приложениях. я по крайней мере. А писать их на языке с дженериками типа какого нибудь C# у меня нет ни какого желания. Не смотря ни на какие дженерики, Го лучше. Значит мы говорим о C++, о темплейтах то есть
Pawel
он возникает потому что единственный способ прокидывать зависимости вл фреймворке без глобальных переменных во множество хендлеров — это использовать какое-то обобщённое хранилище зависимостей и состояния, это либо context.Context, либо какая-нибудь map[string]interface{} Попробуйте написать развесистое приложение с большим количеством команд и подкоманд — и гарантированно окажетесь в ситуации, когда у вас есть 100500 геттеров и сеттеров для каждой зависимости в контексте. Дженерики — это не темплейты. Темплейты — это не дженерики. Мир станет лучше, когда люди запомнят это )
обобщённое хранилище зависимостей и состояния - трудно понять о чём у вас речь, но похоже на какой-то страшный сон. У меня ничего подобного нет. И каких то кастомных алгрбаических типов данных, в которые без дженериков никак - тоже нет. Приблизительная сфера - внутрикорпоративный софт, клиентские аппы для опердней, банк. Зато много дёрганий железа, сокетов (в том числе родных) и нужна многопоточность. Jvm не подходит - это слишком жырно.
Konstantin
безотносительно того, что ты примерно прав, жвм просто надо уметь готовить
Konstantin
в общем и целом на сетевых задачах получаются цифры одного порядка с го
Konstantin
не спорю, джава поднадоела
Konstantin
я лишь о том, что в общем случае утверждение "го намного производительнее джавы" - неверно
Мерль
я лишь о том, что в общем случае утверждение "го намного производительнее джавы" - неверно
у в моём случае производительность и близко не так важна как удобство разработки и поддержки, и вот я похоже нашёл второй конкретный случай когда go проигрывает по этим показателям большому количеству других языков
Konstantin
аргументы удобства разработки после некоторого размера кодовой базы сильно начинают говорить за джаву
Konstantin
но у меня нет особого желания холиварить, думаете, что го - полноценный язык для написания любого класса приложений - воля ваша
Мерль
как по мне, go почти идеален для небольших сетевых проектов
Konstantin
согласен полностью
Konstantin
для развесистой бизнес-логики, что мы привыкли называть "энтерпрайзом" - уже сильно хуже
Konstantin
возможно даже для десктопа хуже, тк там практически нету io-bound задач, в которых го особенно хорош
Заур
в объявлении на работу как бонус надо указывать "частые, многосерийные холивары"
Заур
людям явно это нравится
Konstantin
людям нравится через призму собственных взглядов показывать собственное превосходство. не "я крутой, а вы дураки" - это слишком примитивно, а "я пишу на го, а вы на сраной джаве, я крутой" - уже вполне лучше
Konstantin
это относительно быстро проходит и начинаешь смотреть на операционные системы, языки программирования, фреймворки итд итп - как на иструменты, со своими плюсами и минусами. и понимаешь что и где будет хорошо, а не бегать с выпученными глазами и кричать "я щас гуи буду на го писать. и бложик себе. и опердень в банке. го! го! го!"
Pawel
я лишь о том, что в общем случае утверждение "го намного производительнее джавы" - неверно
не думаю что Го производительней джавы - с чего бы? тот же gc, тот же хип, но в jvm есть jit оптимизация в го проще утилизация многоядерности благодаря CSP, нет убиц времени, эксепшенов и ООП-содомии и толстой виртуальной машины jar-hell-ом и xml driven development-ом. Го проще и меньше проблем создаёт, чем джава
Konstantin
jar-hell и xml весьма опосредованно относятся к ЯП
Konstantin
возможно, я не особо разбираюсь в ui-задачах и правда ваша
Pawel
jar-hell и xml весьма опосредованно относятся к ЯП
а кому в 18-м году нужен ЯП сам по себе без инфраструктуры и экосистемы? надо всё в комплексе же оценивать
Alexander 🐕
Golang говно
Konstantin
а кому в 18-м году нужен ЯП сам по себе без инфраструктуры и экосистемы? надо всё в комплексе же оценивать
наверное, вам лучше знать, что же там сейчас в джаве творится, зачем я буду тратить время и расскказывать о том, что там сейчас происходит
Pawel
Golang говно
как ты посмел. ты разбил мне сердце
Konstantin
и что нынче сервисы пишутся без единой строчки хмл, моментально стартуют и имеют меньший размер бинаря и меньший футпринт памяти, чем го при схожих задачах
Pawel
Golang говно
все остальное еще хуже.