Pawel
Ну и конечно же автор не счёл нужным даже попытаться привести пример из практики, где без дженериков никуда. Чсх.
Мерль
маршалинг json отдельная тема, его глупо делать через что-то кроме интроспекции
Его вполне нормально делают в том же русте через макросы, получается очень красиво и удобно И быстро, ЧСХ
Pawel
У меня кстати после прочтения The Rust Programming Language сложилось первое впечатление, что Rust состоит сплошь из неудобных в использовании костылей (которые почему-то называют zero-cost abstractions, забывая про ментальный cost) где в жертву memory safety и data race safety приносится всё что только можно. Не завидую программистам, пишущим на rust многопоточные программы, работающие с shared mutable state :) Поразило отсутствие аналога go-шных горутин в стандартной поставке rust. Обнаружил там только стандартные потоки операционной системы, потребляющие мегабайты памяти под стек при старте и жрущие процессорное время при переключении между ними. Не понятно, как в этом случае писать серверные приложения, обрабатывающие миллион одновременных подключений. Через callback hell?
Мерль
Ну и конечно же автор не счёл нужным даже попытаться привести пример из практики, где без дженериков никуда. Чсх.
Я могу привести Во-первых, это коллекции Ты либо делаешь коллекцию с interface{}, либо прикручиваешь очередной кодогенератор сбоку, и то и то уродливо для невозможности Во-вторых, это всё связанное с обработкой структурированных данных Датафреймы? Забудьте. Нормальная линейная алгебра? В топку
Pawel
Его вполне нормально делают в том же русте через макросы, получается очень красиво и удобно И быстро, ЧСХ
тут надо ещё смотреть насколько важна эта быстротат в реальных проектах. и стоит ли она потери времени на компиляцию макросов. И самый киллер аргумент - с макросами не будет ни какого gogland, будет хз что как в русте))
Мерль
тут надо ещё смотреть насколько важна эта быстротат в реальных проектах. и стоит ли она потери времени на компиляцию макросов. И самый киллер аргумент - с макросами не будет ни какого gogland, будет хз что как в русте))
А что в русте не так? Vscode + rls прекрасен чуть менее, чем полностью Тут дело не в быстроте самой по себе , а в том, что это не требует рефлексии и в тоже время удобно и быстро
Мерль
Я уже не говорю о том, что 80% проблем, которые в Go решает набор линтеров, в русте решает компилятор
Мерль
У меня кстати после прочтения The Rust Programming Language сложилось первое впечатление, что Rust состоит сплошь из неудобных в использовании костылей (которые почему-то называют zero-cost abstractions, забывая про ментальный cost) где в жертву memory safety и data race safety приносится всё что только можно. Не завидую программистам, пишущим на rust многопоточные программы, работающие с shared mutable state :) Поразило отсутствие аналога go-шных горутин в стандартной поставке rust. Обнаружил там только стандартные потоки операционной системы, потребляющие мегабайты памяти под стек при старте и жрущие процессорное время при переключении между ними. Не понятно, как в этом случае писать серверные приложения, обрабатывающие миллион одновременных подключений. Через callback hell?
В руст завезли фьючи, а недавно и async await в приемлимом виде, так что сейчас там с асинхронностью не настолько прекрасно, как в Go, но получше, чем во многих других языках
Pawel
Я могу привести Во-первых, это коллекции Ты либо делаешь коллекцию с interface{}, либо прикручиваешь очередной кодогенератор сбоку, и то и то уродливо для невозможности Во-вторых, это всё связанное с обработкой структурированных данных Датафреймы? Забудьте. Нормальная линейная алгебра? В топку
Какие контейнеры кроме array и hashmap вы используете каждый день? Эти два контейнера встроены в Go и позволяют работать с произвольными типами. Остальные используются (у меня) настолько редко, что не составляет никакого труда написать их кастомную реализацию под требуемый тип данных.
Мерль
Какие контейнеры кроме array и hashmap вы используете каждый день? Эти два контейнера встроены в Go и позволяют работать с произвольными типами. Остальные используются (у меня) настолько редко, что не составляет никакого труда написать их кастомную реализацию под требуемый тип данных.
Никакие и по очень простой причине: в Go их почти невозможно реализовать нормально. Поэтому как только мне нужно делать что-то сложнее hashmap, я беру питон Мне не хватает возможности сделать стек, R-деревья, вот недавно понадобилась очередь с приоритетами, и знаете что? Я плюнул и взял питон, потому что тратить время на написание уже 100500 раз написанного до этого кода, а потом на его тестирование мне не хочется Если вы используете Go исключительно как dsl для вебчика (взять данные, сходить к базе, отдать данные), то ради бога, вам не понадобится ничего сложнее hashmap Как только ты делаешь шаг в лево, шаг в право — финиш, выясняется, что тебе нужно писать либо велосипед, либо проделывать кодогенератор в пайплайн, либо кастить пустые интерфейсы на каждый чих
Мерль
Многие вещи делаются в Go легко и приятно, но всё вне узкой области задач не делается почти никак
Мерль
Например в текущем виде в Go не будет нормальных lock free структур данных, что для языка со столь удобной многопоточной асинхронностью просто смешно и нелепо
nikita
Многие вещи делаются в Go легко и приятно, но всё вне узкой области задач не делается почти никак
на го пишут для довольно узких областей задач, на одной из которых (так уж получилось) основан веб, а другая почти стала стандартом виртуализации если ты пишешь что-то другое - тебе не нужен го, не стоит себя мучать
nikita
я про докеры и кубернейтесы
Anonymous
я про докеры и кубернейтесы
ни то, ни другое не виртуализация)
nikita
слушай, есть задача, есть инструмент
Pawel
Никакие и по очень простой причине: в Go их почти невозможно реализовать нормально. Поэтому как только мне нужно делать что-то сложнее hashmap, я беру питон Мне не хватает возможности сделать стек, R-деревья, вот недавно понадобилась очередь с приоритетами, и знаете что? Я плюнул и взял питон, потому что тратить время на написание уже 100500 раз написанного до этого кода, а потом на его тестирование мне не хочется Если вы используете Go исключительно как dsl для вебчика (взять данные, сходить к базе, отдать данные), то ради бога, вам не понадобится ничего сложнее hashmap Как только ты делаешь шаг в лево, шаг в право — финиш, выясняется, что тебе нужно писать либо велосипед, либо проделывать кодогенератор в пайплайн, либо кастить пустые интерфейсы на каждый чих
никогда не писал продакшен код на питоне, но что-то сомневаюсь что в нём реализация r tree кардинально лучше этой https://godoc.org/github.com/dhconnelly/rtreego
nikita
ни то, ни другое не виртуализация)
а как это назвать? может термин не тот, но суть все уловили, я надеюсь
Anonymous
слушай, есть задача, есть инструмент
не все так просто, иначе бы в мире был только си и джаваскрипт)
Мерль
слушай, есть задача, есть инструмент
Ога, молоток, которым можно забивать исключительно гвозди с квадратной шляпкой. В один момент тебе понадобится забить гвоздь с круглой, и встаёт вопрос: а нафига такая узкая экологическая ниша?
Pawel
стек, очередь - массив + минимальный бойлерплейт
nikita
не все так просто, иначе бы в мире был только си и джаваскрипт)
си и Джава скрипт не решают бизнес задач по повышению производительности программистов, поддержке кода и так далее
Мерль
никогда не писал продакшен код на питоне, но что-то сомневаюсь что в нём реализация r tree кардинально лучше этой https://godoc.org/github.com/dhconnelly/rtreego
Она кардинально лучше, потому что мне не нужно кастить интерфейсы. Собственно, именно такие вот случаи сводят достоинства Go, частности, статическую типизацию, в нуль
Мерль
стек, очередь - массив + минимальный бойлерплейт
> минимальный бойлерплейт Это не про Go)
Мерль
В случае Go это означает, что ты пишешь целый отдельный пакет со своими тестами
Мерль
Ты должен будешь заново сделать штуку, которую делаются учебниках Каждый раз
Мерль
Проще взять другой язык
Мерль
ок, тогда еще джава
Да просто джава и си, чо уж там)
nikita
ок, тогда еще джава
https://cacm.acm.org/magazines/2017/10/221326-a-large-scale-study-of-programming-languages-and-code-quality-in-github/fulltext
Pawel
Она кардинально лучше, потому что мне не нужно кастить интерфейсы. Собственно, именно такие вот случаи сводят достоинства Go, частности, статическую типизацию, в нуль
в джаве - тот же подход для подобных вещей как в этой либе - работать с интерфейсом, который задаёт контракт для клиентского кода, и потом кастить из него обратно. Это приблезитьельно в 1.5 - 2 раза больше кода и раз в 10 более запутанно выглядит чем в Го. Ни кто особо не жалуется и не спешит перейти на питон))
Anonymous
опять вы устроили гавно срач по языкам
Pawel
В случае Go это означает, что ты пишешь целый отдельный пакет со своими тестами
на стек тесты банальные, их элементарно написать. А сколько у вас "стеков" примерно если не секрет?)
nikita
лол
nikita
не все так просто, иначе бы в мире был только си и джаваскрипт)
nikita
ок, тогда еще джава
nikita
ок, тогда хаскель и скалу)
nikita
опять вы устроили гавно срач по языкам
Anonymous
ах
Anonymous
ну опять я устроил срач по языкам
Anonymous
ну судя по фразам без контекста
nikita
без контекста тут были только примеры неполноценности го
Pawel
Я много кода ревьюю каждый день, бойлерплейт на подобные тесты на стек и очередь как то не сильно напрягает. А вот чтобы понять, что написано в loc на расте - надо как правило почитать про кучу трейтов, структур, увидеть кто и как наследует всякие Read + Write + Any + Send + Typeable, осилить еще и эти трейты, перечитать реализации всех трейтов дальше по коду, разобраться, какой из них из std, какой локальный и прочая, прочая и прочая. Меня смущает вот эта "нелокальность" языков, когда для того, чтобы понять происходящее, надо идти не в базовую либу, документацию и класс-предок, а облазить пол-интернета, кэши пакетных менеджеров, исходники либ на гитхабе и половину stackoverflow и гуглогрупп разработчиков языка. Да, стат. ад-хок полиморфизм в расте работает при мерно на 5 нс на один каст быстрее, чем даункасты в Го. Но проблемы с последними в проде - это нонсенс, а если и появляются, то решаются мгновенно.
Anonymous
Я много кода ревьюю каждый день, бойлерплейт на подобные тесты на стек и очередь как то не сильно напрягает. А вот чтобы понять, что написано в loc на расте - надо как правило почитать про кучу трейтов, структур, увидеть кто и как наследует всякие Read + Write + Any + Send + Typeable, осилить еще и эти трейты, перечитать реализации всех трейтов дальше по коду, разобраться, какой из них из std, какой локальный и прочая, прочая и прочая. Меня смущает вот эта "нелокальность" языков, когда для того, чтобы понять происходящее, надо идти не в базовую либу, документацию и класс-предок, а облазить пол-интернета, кэши пакетных менеджеров, исходники либ на гитхабе и половину stackoverflow и гуглогрупп разработчиков языка. Да, стат. ад-хок полиморфизм в расте работает при мерно на 5 нс на один каст быстрее, чем даункасты в Го. Но проблемы с последними в проде - это нонсенс, а если и появляются, то решаются мгновенно.
даешь годклассы!
Pawel
Ну и если в общем сравнивать, не вдаваясь в половую разницу дженериков и интерфейсов, прежде чем делать какие-то выводы, надо вспомнить, что сложность кода растет с сокращением синтаксиса. Поэтому чем больше проект, тем меньшую роль играет краткость синтаксиса в минимизации объема кода. На первое место выходит архитектура проекта, а Go поощряет простоту архитектуры. Поэтому на го много чего написано, не только вебня. А раст предпочитают любить на rust-тоянии
Pawel
А что в русте не так? Vscode + rls прекрасен чуть менее, чем полностью Тут дело не в быстроте самой по себе , а в том, что это не требует рефлексии и в тоже время удобно и быстро
я чуть не сдох умонавшись за пол дня, но так и не смог добиться чтобы оно мне типы показывало и в семантическое автодополнение умело. С учетом того, что там нет REPL, и почти все полезные фичи реализованы в виде системы типов - анализатор времен жизни, трейты, input/output типы, мутабельность и прочее, а либы представляют собой трэш из очень генерик кода на трейтах - без типовыводилки и ссылок из IDE на документацию и исходники типов пользоваться языком достаточно сложно.
Pawel
А вот линейная алгебра и прочий матан - действительно реальный кейс для джененриков. Но чтобы оно было прям вот критично для выживания и поводом перейти на питон (??) - я бы не сказал
Dmitry
dep, glide, gb, govendor, godep
Ага, вот glide и использую. Потому что чистый go get это не выносимо когда используешь опенсорс
Dmitry
Код библиотек постоянно находится в движении и поломки без фиксирования версии неизбежны. Как при сборке, так и в продакшене(CI выкачал новую версию, в которой есть баг и тут случился "упс"). Можно использовать вендоринг, но это решение не подходит для разработки библиотек у которых есть зависимости
Dmitry
Я то понимаю, но вот там товарищ сверху пишет что ничего кроме go get нинужно и инструменты типа cargo, хранящие список пакетов в отдельном файле не хорошие :)
Alexander
Понедельник - день тяжёлый.
Alexander
Шеф сказал, что мы заканчиваем программировать на GO и переходим на .NET 😪
Alexander
готов выслушать сочувственные речи
Anonymous
из-за Tiobe
Alexander
А не знаю еще, сайтик какой то
Artem
сайты на .net фи как вульгарно, для сайтиков есть же php, nodejs, python на худой конец
Slach
Шеф сказал, что мы заканчиваем программировать на GO и переходим на .NET 😪
если под .NET Core под Linux, то еще более или менее норм главное чтобы формочки на WPF и Linq писать не заставил
Slach
зато с azure поработаешь =) 18 лет назад я так ASP после PHP за неделю выучил =)
Quet
go way в данном случае - папка vendor. абсолютная панацея от дибилизма на подобие cabal hell
"пример хорошего тулинга - go get" и именно поэтому пилят dep видимо ) про cabal hell если честно смешно, когда ты последний раз реально сталкивался с этим? (а не читал пост от 2005 года где говорилось что есть такая проблема)
Pawel
Шеф сказал, что мы заканчиваем программировать на GO и переходим на .NET 😪
net core - фигня полная. дубль-джава, отстающая в развитии на 10-15 лет. Сайтики на ней писать - боль, ибо UTF16 и надо асилить и притянуть в проект сверхсложный монстро-фреймворк с кучей бесполезных костылей чтобы написать хелуворд. размер докер-имиджа не реальный проект с этим всем - от 500 мб до 1 гб
Pawel
А debug версия весит таки 750 . В реальном продакшен проекте по мимо asp net core нужен ещё воз с кирпичами. Это в гошечке всё, что нужно, есть в стандартной библиотеке искаропки. А в нэт коре на любой чих начинается мучительный поиск очередной маргинальной библиотеки от непонятно кого (и не дай бог допустить малейшую ошибку с версией любой из них), которые примерно на пол гига и будут.
engelbart
Павел, ваша боль понятна. Я её даже разделяю. Но где net и где канал про go ?
Pawel
Павел, ваша боль понятна. Я её даже разделяю. Но где net и где канал про go ?
Не я же эту тему поднял, и оно не то чтобы совсем го не касается - полезно же сравнить по приколу. Ну и воены "за всё хорошее против всего плохого" негодуэ, приходится их иногда одёргивать)) А добавть к сказанному нечего, да.
Quet
довольно самокритично было про "военов" )
Pawel
https://stefanprodan.com/2016/aspnetcore-vs-golang-data-ingestion-benchmark/
Artem
чтд
Y
Доброе утро. Кто может подсказать как на Go переместить папку с файлами из одной директории в другую ?