Это копия, сохраненная 10 июля в 07:27.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
С чего начать:
- В обязательном порядке проходим Go Tour:
https://go.dev/tour/welcome/1
- Читаем документацию прямо по порядку (пункт "Learning Go"): https://go.dev/doc/
- Ознакамливаемся с общим roadmap по изучению языка и сопутствующих инструментов: https://github.com/Alikhll/golang-developer-roadmap (постоянно обновляется сообществом)
Литература:
- Донован, Керниган "Язык программирования Go"
- Также хорошие книги для начала: https://www.golang-book.com/ и https://www.practical-go-lessons.com/ (веб-версия - бесплатная и хорошо подходит для новичков в программировании)
- Книги из списка https://github.com/dariubs/GoBooks
Полезные ресурсы:
- Сборник паттернов и инфы по микросервисам: https://microservices.io/
- Обновляемый список с пакетами: https://github.com/avelino/awesome-go
Прошлый тред:
>>2996967 (OP)
>или хотя бы просто htmx?
Пробовал, короче для туду листа охуенная вещь, как только нужно как-то обрабатывать ответы, например те же ошибки более детально, то тут и начинается жопа. Для какой-нибудь внутренней админки подойдет, как раз там примитивная верстка и жиквери от которого можно отказаться. Но если для продакшна с пользователями, то проще на реакте накидать фронт и не ебаться с этим говном.
Так и есть, только с разницей в том что нужно добавить всего пару атрибутов вместо лапши на js
я не смог не потому что лоускилл, а потому что вакансий нету и конкуренция ебанутая
На жс и во фронте вакансий примерно на порядок больше, чем на го
на гоу требуется больше скилла чем на жээсе, где в основном кнопочки накатывать с фигмы и обработчики вешать. Иди качайся и глупых вопросов не задавай. Вообще сам факт постановки такого вопроса как бы намекает что ты не тем занимаешься хуйнёй страдаешь
извини, возможно вопрос был несколько неопределенный. Меня интересует только будет ли вкат свободнее и проще в плане что не будет 900 откликов на вакансию. Возможно мне нужно отредактировать резюме. Только я не ебу как хакнуть эту систему, чтобы выбрали именно меня, а не рэндомного ванька. Знаю только что херки смотрят больше в топе,а чтобы в топ попасть нужно ставить опыт и чтобы ключевые навыки совпадали 100%. У меня год опыта стоит
Универ + стажировки от него помогают
Никак не хакнуть. Научись что-то представлять из себя. И откликайся. Чем больше откликов, чем больше знаний - тем выше шанс получить офер. Даже я синьор помидор десять лет стажа порой сильно лажаю на интервью, потому что это отдельный скилл, который надо качать. То есть чаще интервьюироваться.
Пока что не получается.
Складывается ощущение, что это просто кей-валью, который прокидывается откуда-то сверху, но это явно не так.
Это буквально кей-вэлью коллекция. Используется для передачи глобальных переменных.
Если мы хотим покрыть код тестами, от глобальных переменных придется отказаться - их хуй замокаешь. Глобальные переменные можно передать двумя способами. Допустим, нам надо имя текущего пользователя. Можно передать через DI, как в сишарпе, мы просто добавляем какой-нибудь интерфейс IUserContext со свойством UserName, присваиваем значение на входе в наш контроллер и дальше инжектим этот интерфейс, где надо. Просто и элегантно, это не говей. Можно взять словарь, добавить юзернейм туда и тупо прокидывать этот словарь через все методы. Таков путь.
>Используется для передачи глобальных переменных.
нихуя. скоуп глобальных переменных другой. переменные в контексте реквест-скоупед по задумке. могут быть глобальными для программы, если у тебя есть корневой контекст, но это намного реже используется.
>Если мы хотим покрыть код тестами, от глобальных переменных придется отказаться - их хуй замокаешь
глобальные переменные как раз можно использовать для моков - например, вместо time.Now() объявить глобальную переменную-функцию, которая в тестах будет вместо текущего времени возвращать фиксированное значение. или за счет того, что это локальная переменная, а не константа, переопределить в тестах какие-нибудь таймауты до приемлемого значения, чтобы ускорить прохождение.
то, что это замена передачи словаря - да.
Это linkedlist из keyvalue, на который накрутили возможность трекать лайфтайм и отменять контекст. Сейчас контексты используются преимущественно для отмены вывполнения дринной операции, результат которой уже не нужен и контект которой отменили.
>>057116
Спасибо. Стало понятнее. Очередной инкремент на курсах таки сдал.
Надо будет попрактиковаться еще немного, потому что хоть и пробросил, но не понимаю, как это все-таки на практике работает.
Когда инициализирую БД, то тут понятно. Сам задал контекст, не успел по таймауту, вылетел.
Но вот есть хендлер, я из запроса беру контекст и кидаю по стеку вниз.
А откуда там этот контекст берется? Генерируется сервером?
> А откуда там этот контекст берется? Генерируется сервером?
да. ну как пример ты на сервере можешь настроить ReadTimeout/ReadHeaderTimeout, чтобы твой сервис не ддосили нищуки с медленным интернетом. таймаут кончается, и контекст отменяется.
аналогично клиенты могут тебе передать какой-нибудь x-deadline хедер, чтобы мидлвара поставила кастомный таймаут на запрос.
можно BaseContext при создании сервера указать, чтобы контексты в реквестах от него шли.
Курс Седжвика на курсере.
Нужна доза копиума, поделитесь успешными историями вашего вката в го. Только без пхп синьоров, а прям с нуля.
Успешно задрочил вопросы собесов и накрутил 2 года опыта. Приняли на работу в хорошую компанию на 240к. Через 3 недели мне устроили экзамен по голангу и вебу, который я завалил будучи волчарой. Сейчас охочусь на следующего кабана.
Начал изучать го, потом дропнул его, потому что уже в каждой перделке есть свой асинк/авейт и незачем писать в процедурном стиле 70х годов, теребя каждую ошибку.
Не соглашусь, что контекст для прокидывания глобальных переменных. Это про прокидывание переменных, которые должны пропагироваться по всей цепочке взаимодействия.
Самый простой пример это реализация дистрибьютед трейсинга:
прилетает http-запрос с request-id, хендлер запроса идет во внешний сервис за обогащением и затем сохраняет что-то в БД.
Чтобы связать все эти запросы в логах/трейсах тебе нужно передавать далее по цепочке этот request-id, который уместно хранить в контексте - тут да, контекст можно рассматривать как key-value.
Второй кейс с контекстом - когда тебе нужно прервать цепочку вызовов. Это делается через отмену контекста - отменяешь родительский контекст и все остальные по цепоче тоже отменяются (при условии, что код пикладной код слушает отмену). Таким образом удается избегать ситуаций, когда клиент уже отвалился по таймауту, хендлер держит коннекты, ожидая ответа от другого сервиса/БД
С нуля стажерами охотно берут во всякие мейл ру, яндекс и озон. Ну если ты студент конечно.
А так у меня история такова, что я пошел будучи нулевым на проект, где мне обещали микросервисы на котлине и гоуленге. В итоге это все наебаловом оказалось, проект - старая дрисня в виде копролита на питухоне 3.5, и только лишь один мертвый сервис на го, разработчик которого уволился в другое место, а сервис закопали, так как он недоделанный оказался.
Сейчас по вечерам пытаюсь учить го, где-то осенью буду пытаться сваливать с парашного проекта в другое место, где будут исключительно го и микросервисы, а не древние копролиты.
>С нуля стажерами охотно берут во всякие мейл ру, яндекс и озон. Ну если ты студент конечно.
Там же конкуренция уровня 500 человек на место и берут только йоба-олимпиадников. Заебись ты копиума выдал...
У озона в специальной олимпиаде для мидлов в нынешнем потоке было зарегистрировано 512 человек. Для отсева там проводится контест за 5 часов нужно решить 9 задач, человек 80 выполнило все задания из них оставляют где-то не больше 30, остальным отправили письма счастья с пожеланием хорошего дня. В приоритете люди из городов в которых есть офисы озона и кто будет работать в стойле. Для джунов боюсь представить что там происходит.
Задачка про Ваню забавная
>древние копролиты
Почему-то на микропенисы дрочат ньюфаги, которые с ними никогда не работали. Маркетологи промыли пориджей, мое почтение. Ты еще будешь с тоской вспоминать монолит, который можно просто открыть на компе, просто расставить брекпоинты и посмотреть, как все работает.
> монолит, который можно просто открыть на компе, просто расставить брекпоинты и посмотреть, как все работает
это после скачивания 20ГБ кода и ебли с зависимостями? я 5 микросервисов подниму и расставлю брейкпоинты за время когда это всё качается
ну ты же понимаешь что 99% людей тупые с айкю как у хлебушка? из 500 человек там штук 5 которые могут лампочку вкрутить
Ты конечно же не из тех 99% да?
Да это похоже один шиз пишет, который в растотреде всех заебал, он похоже студент, нихуя не работавший и постоянно про каких-то маркетологов пиздел.
блядь, не тот тред. Ебать я снайпер.
Правильно ли я понимаю, что возможность удалять свои посты так и не завезли?
Хуясе чёрная магия. Благодарю.
>Правильно ли я понимаю, что возможность удалять свои посты так и не завезли?
После регистрации, можно удалять и редактировать. Регистрация доступна через госуслуги.
Я другой анон и вопрос немного оффтопный и вопрос не конкретно к тебе, но...
Как преподнести интервьюеру что сначала я 2-3 года нормально работал, а когда война началась я 2 года ебланил? В прошлый раз на собесе сказал правду и почувствовал какое-то напряжение из-за этого ответа, вроде бы.
Еще мне как-то один знакомый сказал, что в яндексе есть БД в которую складывают результаты собесов чуть ли не вместе со стенограммой и не с досье на человека. Звучит сомнительно, но с тех пор я еще сильнее боюсь собеседоваться. Какая-то параноидальная мысль стоит в голове, что все они как-то отслеживают нас. И что если ходить на все собесы на которые меня приглашают, то рано или поздно не останется работодателей, которые не знают, что я долбаеб. Рано или поздно работодатели кончатся! А вдруг крупные компании типа яндекса и, хз, VK, например, уже давно обмениваются инфой? Чтобы не тратить время на мусорные собесы? И Яндекс даже не прислал письмо мне с отказом именно по этой причине? Потому что когда-то я плохо проходил собес у VK? Знаю, что этот абзац, скорее, полностью бред, но иногда меня накрывает такая шиза, что хочется к какому-то специализированному на hr психологу сходить. Но потом отпускает и я не иду.
В сбере и для сенек голодные игры уже сделали. Человек 80 всегда участвуют. Только там отсев по трудовой, чтобы джентльмены удачи не доёбывали.
Это для перекатывающихся из других языков
Я просто к форчану привык
>это после скачивания 20ГБ кода и ебли с зависимостями? я 5 микросервисов подниму и расставлю брейкпоинты за время когда это всё качается
Зависимости надо скачать один раз, а ебаться с поиском проебанного реквеста каждый день. Или выяснять какого хуя простой запрос отрабатывать за 5 минут, какой из 20 микропенисов тормозит.
В раше скоро так и будет, по паспорту, трудовой и обязательной гос-сертификации.
>, какой из 20 микропенисов тормозит
Это уебанская архитектура, у тебя не микросервисы, а распределенный монолит. В большинстве случаев сервис должен жить сам по себе и нигде не запрашивать данные, а другим сервисам отправлять запросы в очередь. Ты еще скажи что у вас эти 20 сервисов по rest api общаются
>Это уебанская архитектура, у тебя не микросервисы, а распределенный монолит.
Сразу видно джуна. Сеньки то знают, что рано или поздно любая микросервисная система превращается в распределенный монолит.
>В большинстве случаев сервис должен жить сам по себе и нигде не запрашивать данные, а другим сервисам отправлять запросы в очередь.
Один совет ахуительнее другого. А клиент тоже должен очередь слушать, на предмет когда его запрос запроцессится?
я являюсь рекрутером в IT
Большинство компаний использую CRM, куда сохраняются твои резюме. То есть если я тебя нашел 2 года назад и сохрнил твой профиль, где у тебя одни компании, а сегодня нашел снова твой hh и снова добавил тебя в crm, а у тебя там совсем другие работодатели, нежели которые были 2 года назад, то она соединит твое резюме и я пойму что где то ты врешь)
в жопу ты пойдешь
я своё резюме раз 5 переписывал, потому что работодатели менял имена компаний, потому что добавлял или уточнял детали и сроки, удалял старый опыт когда у тебя больше 5 айтемов в резюме его никто не будет читать до конца
хуёвый ты эйчар, хуй будешь?
Какой забавный джуник.
>другим сервисам отправлять запросы в очередь
Классика. Ты даже не представляешь, как ты ОХУЕЕШЬ через пару лет отлаживать такую архитектуру.
> Сеньки то знают
А ты что знаешь?
>А клиент тоже должен очередь слушать, на предмет когда его запрос запроцессится?
Во первых не нужно разбивать совсем на микрописьки, а исходить как раз таки из бизнеслогики. Если клиенту нужно мгновенно получать какие-то данные, но их нет в этом сервисе, значит их нужно дублировать в этом сервисе в рамках разумного конечно же, при этом в случаи коллизий приоритетным должен быть тот сервис которому эти данные принадлежат. Все запросы на мутацию/добавление данных отправлять в очередь, а на клиент отправлять статус "делается".
Помню мы ебались с микрописечной архитектурой, в итоге объеденили 3 сервиса в один над которыми я работал один лол, они были очень сильно связаны между собой. Добавили 2 таблицы данные для которых брали из другого, а все телодвижения с другими сервисами убрали в очередь. Пришлось ПМке и дизайнеру объяснять что нужно добавить на фронт промежуточный статус для некоторых действий, плюс фронту немного помог с оптимизацией, он много лишних запросов делал. И о чудо вместо 10-15 секунд у меня все выплевывалось на фронт за милисекунды. В ТП вообще обрадовались, до этого постоянно заебывали что всё тормозит.
Сделали практически тоже что этот мужик рассказывал https://www.youtube.com/watch?v=FF-GZ7iipwc
Веселая у вас галера. Джун на фронте не понимает, как работает сеть, про апи гейтвей тоже ничего не слышал. Джун на бэке пытается изобрести ивент сорсинг, но делает это через жопу. Микросервисы пишутся одним человеком, каргокульт такой каргокульт.
Чего сказать-то хотел?
>Во первых не нужно разбивать совсем на микрописьки, а исходить как раз таки из бизнеслогики. Если клиенту нужно мгновенно получать какие-то данные, но их нет в этом сервисе, значит их нужно дублировать в этом сервисе в рамках разумного конечно же, при этом в случаи коллизий приоритетным должен быть тот сервис которому эти данные принадлежат.
И через пару итераций получим монолит, так стоило-ли сопротивляться?
>Все запросы на мутацию/добавление данных отправлять в очередь, а на клиент отправлять статус "делается".
Пользователь изменил настройки, нажал кнопку сохранить, а ты ему такой: "сохраняем, пожалуйста подождите". Ю - юзабилити!
Двачаю. Пихать всё в кролика это шиза ебаная. Есть функционал, где надо/можно дать ответ сразу, там RPC. Есть функционал, где невозможен/не нужен немедленный ответ, там брокеры.
Может быть огромное количество причин, почему ты не узнал, что это спалили, начиная от того, что просто ранее тебя это компания не видела и не добавляла в crm и заканчивая, что рекрутеру просто на это всё равно.
Но ты - обезьяна этого не понимаешь, тебе бы лишь бы хуйню написать. Лучше бы так собесы проходил, как на двачике пытался самоутвердиться. А то процентов 80% разрабов при первом общении отлетает по софтам:)
>И через пару итераций получим монолит, так стоило-ли сопротивляться?
Это из крайности в краность, любо микрописьки, либо монолит-сталагмит из говна на жабе. Надо искать золотую середину, самое главное сделать так чтобы было меньше связей между сервисами.
>Пользователь изменил настройки, нажал кнопку сохранить, а ты ему такой: "сохраняем, пожалуйста подождите". Ю - юзабилити!
Не совсем так, допустим одно из действий:
Надо было подключать услугу на устройствах, у меня в БД все что нужно было добавилось и дальше надо в сторонний сервис чтобы эта хуйня включалась на устройствах. Раньше приходилось ждать пока они все подключатся иногда падало по таймауту, пользователь сидел тупил и иногда у него не получалось, он шёл в ТП, ТП к ПМ, ПМ ко мне. Я хуй его знает чего делать у меня в логах по таймауту все упало, дальше по цепочке оно там все сделалось как надо, в ЛК у пользователя нет нихуя.
Короче сделали что все взаимодействие со сторонними сервисами было в очереди, а на фронте появлялось сообщение что ХХХ в процессе подключения, дизайнер еще проработала разные сценарии, там по красоте было понятно, плюс в основном этим сервисом пользовались инженеры. То есть пользователь нажал и увидел что что-то делается, а не ждет ошибку и в течении пару минут все подключается. Как только они там запердолились мне приходил ответ и я у себя в БД менял статус на "подключено", соответственно когда фронт делал потом запрос, было видно что все подключено. Юзабилити наоборот стало лучше, обращения по поводу этой хуйни в ТП закончились. И еще пару фич на такую логику перепилили.
Те же формирования отчетов для отдела продаж сделали также, они нажимают на кнопку, оно пишет что отчет делается, как сделается у них появлялась ссылка на скачивание эксельки, до этого постоянно ебались и по много раз тыкались.
>Двачаю. Пихать всё в кролика это шиза ебаная. Есть функционал, где надо/можно дать ответ сразу, там RPC. Есть функционал, где невозможен/не нужен немедленный ответ, там брокеры.
Так и сделано было, мы не прям всё убрали в кролика, кое что всё же оставили, но большинство взаимодействий таки убрали
Ну я как пример показать, когда смотрел видос я удивился что мы примерно к тому же пришли. У них там да, прямо все вокруг брокера и на событиях
>>064387
Жесть. Нафига вы подливаете масло в огонь, пацаны? Я за пол года поиска работы пересилел себя только один рай пойти на собес. Теперь, наверное, вообще не пойду, пиздос.
А всем компаниям, которые хранят у себя мои персональные данные без моего разрешения, я желаю банкротсва и пойти нахуй! Хотя я, нав, уже галочку в hh где-то поставил, хз. Возможно, можно как-то галочку отозвать, бтв.
Да и по идее я только hh разрешал данные собирать, разве не?
Блядь, да даже досье на человека по его данным из соцсетей нельзя собирать! Хотя там челидодики сами все напоказ выставялют и даже разрешают поисковикав индексировать их странички
Чел, типобезопасность это Хинди-Мильнер, это ADT ,это exhausive паттерн-матчинг, а не эта погремушка, когда передаёшь всё что угодно в interface{} и компилятору вообще похуй чего ты там "определяешь" из него.
Чел, не парься. Компании уже давно всё о тебе знают. Буквально рейтинг тупизны. Если плохо отсобесился, то это нохаир везде и навсегда.
И длину члена мою тоже знают?
Пиздуй к нам в Озон Финтех пособеседоваться.
Сейчас много ставок открылось, активно нанимают. Попытка не пытка.
А местных больше слушай.
Не забывай ещё про ЧЁРНЫЕ СПИСКИ у хрюшек.
То что ты описал это и есть монолит, когда связанные функции группируют в одно приложение. Совсем не обязательно, чтобы весь функционал был в одном единственном приложении, их может быть несколько. Основная идея это как раз слабая связанность между собой, если другие сервисы недоступны, то базовый функционал все равно будет работать.
Ебнутый что-ли, ты не можешь никак провзаимодействовать с пустым интерфейсом (передача в другой метод или принт не считаются по очевидным причинам), тебе необходимо явно установить тип перед тем как взаимодействовать с тем что скрывается под пустым интерфейсом. Чем не type safety?
>Озон Финтех
>ехал литкод через литкод
>поверни эту строку, поверни ее снова
>спроектируй мне фейсбук за 5 минут
>в итоге взяли дебила, который не знает про idle in transaction и роняет прод в аккурат перед праздниками
Волков бояться - в лес не ходить)))кринж,но как есть
Для рекрутера и бизнеса главное закрыть потребность и найти крутого чувака) Хоть 10 лет опыта накрути, но если ты нормальный по софтам и горишь своей специализацией, то ты пройдешь в любом случае)
Ну значит хуёво он спроектировал фейсбук. На мороз и вкатуна и собеседующего.
>Заебись ты копиума выдал
Ну есть и другие компании, какая-нибудь лига цифровой экономики го джунов тоже набирала в свое время.
Я там работал джава разрабом полгода - коллектив все как один вкатуны по курсам гикбрейнс были, с вышкой только лид (он радиотехнику какую-то в нулевых окончил) и еще один парень, откуда-то из саранска что-ли. Остальные именно что заводчане и грузчики бывшие. И ничего, кое-как их набрали ведь.
>>063617
>Там же конкуренция уровня 500 человек на место и берут только йоба-олимпиадников
Олимпиадником быть не нужно даже для яндекса. Литкод гораздо проще чем олимпиады. Конкуренция есть конечно, но если литкод затащишь, то в яндекс возьмут практически в любую команду, где не нужна математика или мл.
>>063774
>Ты еще будешь с тоской вспоминать монолит, который можно просто открыть на компе, просто расставить брекпоинты и посмотреть, как все работает
У нашего копролита миллиард зависимостей от сторонних сервисов.
Ты его не сможешь запустить в дебаггере, расставив брейкпоинты. Только если тесты писать руками и поднимать тестовую базу в контейнере. И то, далеко не все случаи ты так сможешь раздебажить. Дебажить на поднятом тестинге у нас нельзя, к сожалению. Слышал про то, как иногда можно прям дебаггером подключиться к тестовому серверу и дебажить так, но у нас такое запрещено.
И поверь, дебажить мелкие говнохуитки на гоуленге в десятки раз проще, чем десятилетний код на питоне с адовыми слоями декораторов и метаклассов.
>в яндексе есть БД в которую складывают результаты собесов чуть ли не вместе со стенограммой и не с досье на человека
В любой крупной конторе (да и в любой мелкой тоже) такое есть уже много лет.
В яндексе после каждого собеса о тебе интервьюер пишет свой отзыв, который навечно сохраняется в базе у них. Ну и если ты спустя 10 лет снова в яндекс вернешься, то какой-нибудь собеседующий или потенциальный лид может покекать с того, что о тебе писали десять лет назад.
> и роняет прод в аккурат перед праздниками
Перед праздниками везде фриз выкаток кода, и уж тем более в e-commerce, не пизди.
Максимум - шаблоны разметки, и то под ок бизнеса.
Бамп вопросу
Ты по всем тредам ходишь и ищешь какого-то растера в тредах, понимаешь, что шизом выглядишь сейчас тут ты. Да, люди сидят не в одном треде, нафиг ты это пишешь? Чудо.
Не издевайся, достаточно регистрации почты на мэйл.ру.
>>066268
>Как говноланг мог так взлететь
Синтаксис у него может как у отсталого брата си, но при этом у него есть
1) GC
2) Горутины
3) Компилируемость в бинарь
4) Отличный тулинг
5) Простой синтаксис, который не позволяет писать хитровыебанный загадочный код
Вот и все. Ну и поддержка гугла, разумеется.
После джавы и питухона с их магией на рефлексии/метаклассах/декораторах говноланг это как глоток чистого воздуха.
Как спец могу сказать
-Конкурентность, точнее зеленые функции.
-Один бинарь с рантаймом без VM, отсутствие траха с зависимостями
-Тогда еще могла удивить кросскомпиляция.
На этом все, язык не пригоден для промышленного кодинга, в крупных разработка уже нужны стектрейсы и норм логи, нужно IoC, становятся нужны даже геттеры и сеттеры и хоть какой-то сахар, так как бойлерплейтить больно (но можно, хомяки упертые).
Ну, логи от языка не завсият. Хорошие логи должен сам разработчик уметь правильно писать.
IoC тоже не языко-специфичная тема.
Без стектрейсов может быть тяжеловато конечно, но мы просто ошибки наверх через fmt.Errorf("info: %+v", err) выбрасываем, таким образом добавляя нужную инфу к ошибке слой за слоем. Сорт оф стектрейс.
>4) Отличный тулинг
отличный от нормальных языков.
>>066476
>мы просто ошибки наверх через fmt.Errorf("info: %+v", err) выбрасываем, таким образом добавляя нужную инфу к ошибке слой за слоем. Сорт оф стектрейс.
Стектрейсы для бедных.
Ладно такая херня в Расте или Си еще понятна, у них цел нулевой оверхед, так что извольте поебстись. При том что стектрейсы то есть и их даже можно прицепить к ошибке, просто так не принято.
>отличный от нормальных языков
Лучше чем в jvm тащем-то. Не говоря уже про всратый питон.
Чего только рейсдетектор стоит.
Стектрейсы в голанге так-то есть в голанге, да. Но зачем они нужны? Их всегда тяжело читать, а из полезной нагрузки всего лишь несколько строчек.
>Ну, логи от языка не завсият.
Как пример жаба, где уровень логгов можешь настроить по пакетам. Где-то заглушить, где-то увеличить уровень. Хз написали ли на го нечто такое, но когда я с ним трахался ничего такого не было (было кругом сырое васянство).
>IoC тоже не языко-специфичная тема
Мне гоферы говорили ненужно, как и отладка, они на полном серьезе меня убеждали дебажить принтами.
>но мы просто ошибки наверх через fmt.Errorf("info: %+v", err) выбрасываем,
Человек-эксепшен.
В те года, я практически верил, что они сэкономили на компиляторе, чтобы оставить плацдарм для оптимизации. Но теперь я вижу, что они просто положили болт.
>Их всегда тяжело читать, а из полезной нагрузки всего лишь несколько строчек.
Потому что ты ничего крупнее круда не нюхал. Когда функция foo крашится по четвергам, ты в логах видишь что упала foo, а то что она вызывается 1000 раз из 100 разных мест и по четвергам, говорит тебе о том, что ты будешь дебажить месяц.
это называется плавающая ошибка или heisenbug
Ошибка из функции foo пройдет несколько этапов, в которых наслоятся друг на друга эррор месседжи, и ты будешь знать как минимум место где она вызвана, как максимум обстоятельства. Ну это в случае если все хорошо с кодстайлом на проекте, на моей первой го работе у челов на каждую эррору стоял лог в котором (к счастью автоматически) указывалась строка где лог был вызван, а там уже понятно куда копать. На бумаге хорошо, да вот только и так немалые методы вырастали на процентов 30 и переставали помещаться на один экран, и прочие проблемы с читабельностью
Проброс ошибок, это другая проблема. В общем, опять вспоминая джаву, в ней есть checked исключения и время показало, что это не очень практично указывать исключения в сигнатуре метода, в котлине и шарпах от этого уже отказались.
Это прям реальный пример эволюции, мы пишем достаточно крупный софт, чтобы заниматься еще какой-то херней. Анон выше писал, если для си и раста это приемлемо, ты пытаешься в минимум абстракции, чтобы выжить максимум, то для прикладных, а точнее языков "приложений", это вообще моветон, тупо переложили работу компилятора на плече хомяков.
Кстати, в расте я видел что обобщают ошибки до Box<dyn...>, а это, насколько я понимаю, аллокация памяти. Так что вот тебе и "зеро кост абстракшен".
Ну опять же - если паника необработанная, то будет тебе стектрейс.
Если обычная ошибка, обернутая сообщением, то тоже можно будет понять откуда она прилетела.
Возможно это не очень удобно, но жить с этим не так уж сложно.
>>066531
>Мне гоферы говорили ненужно, как и отладка, они на полном серьезе меня убеждали дебажить принтами
DI в Го это именно что в main функции создавать все нужные зависимости в виде логгеров, пул подключений к БД, подгрузку конфига, его валидацию - и все это запихивать через сорт оф конструктор в какую-нибудь структуру Application, у которой будет метод Run, где будут создаваться и прокидываться друг в друга репозитории, сервисы, контроллеры. Прям как в спринге, только вместо собачек с Component и Autowired у тебя будет ручное создание объектов и ручное прокидывание их в функции-конструкторы.
>ручное прокидывание их в функции-конструкторы
Охуеть, вернули мой 2007. В сишарпе DI фреймворки давно умеют сами резолвить зависимости через рефлексию. Ты просто пишешь в конструкторе у MyController аргумент ISomeInterface, дальше оно само все находит и подставляет.
>Если обычная ошибка, обернутая сообщением, то тоже можно будет понять откуда она прилетела.
Каким местом? Читай внимательно, что написали выше.
Да и понятно, что для мелко-круда можно хоть на баше писать.
— Дженерики есть?
— Дженериков нет.
— Есть дженерики в планах?
— Дженерики не планируем.
— Дженерики можно посмотреть, какие есть?
— Нет, Дженериков в голанге нет.
— Я бы хотел написать дженерик, когда они вообще?
— Извините, у нас нет в планах дженериков.
— Удобные инструменты есть? Мне дженерики нужны.
— Мы их никогда не планировали и не планируем.
И ведь этот гугловец, зараза, знает меня идеально в лицо, знает, что я спрошу и знает, что он мне ответит. Но ещё ни разу ни один из нас ни жестом, ни словом не показал, что каждый из нас знает сценарий. Бывает, зараза курит у входа, когда я захожу в офис Гугла, тогда я подсматриваю за ним сквозь стеклянные двери, он равнодушно докуривает, выбрасывает бычок и возвращается за ресепшен:
— Что вы хотели?
— Мне нужны дженерики.
— У нас нет.
— Жаль.
>Лучше чем в jvm тащем-то. Не говоря уже про всратый питон.
Не пизди, в JVM мире один из самых лучших тулингов. Тут тебе и все возможные билд системы, и центральный репозиторий зависимостей которую спиздили другие языки. И линтеры и коданалайщеры всех цветов и расцветок. Куча всяких прод метрики, логов, трейсеров.
>Чего только рейсдетектор стоит.
Вначале не добавили в язык конкарент коллекции, потом закостылили рейсдетектором.
>Стектрейсы в голанге так-то есть в голанге, да. Но зачем они нужны? Их всегда тяжело читать, а из полезной нагрузки всего лишь несколько строчек.
Внезапно! Ты и в говноланге делаешь стектрейс оборачивая ерр в новый ерр. Потому что колстэк важен почти всегда. Только в нормальном языке стектрейс стандартный и его можно легко парсисть: например Иде может перейти к коду. А в говноланге ты ручками ищешь по тексту сообщения об ошибке.
У тебя концепция кол стека есть не то что на уровне ОС, а даже на уровне процессора. Но нет, пришёл Роб Пайк и сказал что стектрейс не для гойев. себе, для panic, он стектрейс оставил
> Не пизди, в JVM мире один из самых лучших тулингов
Лол
> Но нет, пришёл Роб Пайк и сказал что стектрейс не для гойев. себе, для panic, он стектрейс оставил
Ты можешь забрать стектрейс и паники и пробросить выше, но нахуя?
Что находит и что подставляет? Все наелись этой хуйни и пилят теперь static di, потому что магия магией, а код вот он и по крайней мере не пиздит.
>пук
Нормальных аргументов явно не стоило ждать.
>Ты можешь забрать стектрейс и паники и пробросить выше, но нахуя?
Во первых ты даже стдлиб не знаешь, стектрейс можно и без паники получить. Во вторых, чтобы не ебаться с
>мы просто ошибки наверх через fmt.Errorf("info: %+v", err) выбрасываем, таким образом добавляя нужную инфу к ошибке слой за слоем. Сорт оф стектрейс.
Хотя бы просто прокидывать наверх как есть.
ПОясните, а нах они нужны, когда есть type any(interface{}) ими кто-то ерально пользуентся в проектах???
Ты сам поиск смотрел? Там одни статьи о том когда будут дженерики.
Хотел с умничать, но снова оказался гофером.
Зачем нам ловить ошибки еще на этапе компиляции, когда можно приводить всё к обобщенному типу и делать вид что пишем на языке без типизации? Ну хз, по приколу, наверное.
>Вначале не добавили в язык конкарент коллекции, потом закостылили рейсдетектором
Чел, спокуха. Рейсдетектор нужен не только при работе с коллекциями.
Алсо когда их там в джаву-то добавили, все эти concurrent hash map или skiplist?
Ой извини, медленный кусок глючного кала, в котом нет и доли возможностей тулинга IDE джавы.
>>067518
Вообще gopls довольно шустрый, как понос.
А вот с lsp у джавы беда действительно. Они-то есть, но только лишь какие-то жутко всратые от эклипса и нетбинса.
>>067518
>в котом нет и доли возможностей тулинга IDE джавы
LSP имеет спецификацию. Там все возможности описаны. И что такое IDE джавы? Jetbrains, чьи лицензии больше не купить в РФ? А если через 5 лет jetbrains потонет к хуям что в целом можно ожидать, в конторе далеко не лучшие времена сейчас судя по отзывам знакомых, то где коды писать будешь?
> то где коды писать будешь
Поэтому давайте прям сейчас писать в блокноте с куском говна прикрученным сверху вместо нормальной ide.
Когда потонет, тогда появится потребность и нишу кто-то заполнит. Возможно через lsp надеюсь что нет.
А если завтра упадет метеорит?
Тулинг уже есть, то есть написан, даже через 10 лет это будет хороший тулинг.
LSP как раз и ограничен общей для всех спецификацией, опять ситуация сводящая к одному общему для всех. Так что это хрень для всяких кривых блокнотов на электроне, в которых хер даже сорцы по клику прочитаешь.
>Рейсдетектор нужен не только при работе с коллекциями.
Но чаще всего именно в колекциях он и происходит.
Да и в целом это не тула первой необходимости. А вот билд система, это мастхев каждый день. B Мавен с Гредлом на голову выше гобилда.
>Алсо когда их там в джаву-то добавили, все эти concurrent hash map или skiplist?
В 2004, за 5 лет до релиза го.
>в конторе далеко не лучшие времена
Поделись инсайдами. Сколько команды потеряли после релока? В чём проблемы если рост прибыли стабильный?
Да хуета это всё. Даже эмбаркадеро до сих пор живы. А тут контора которая делает практически безальтернативные IDE для джавы, го, питона, с++, пыха, руби и прочая экзотика. Контора у которой многие годы основной бизнес на западе. Должна загнуться потому что
>лицензии больше не купить в РФ
Да сейчас не самые жирные годы, все АйТи компании ужимаются.
Если у меня опыт предыдущий в основном в виде питухона и монолитов, то как сложно будет найти себе команду, если технические секции будут пройдены хорошо?
Там же у вас наверняка алгоритмы + го + многопоточка на секциях?
Лично мое мнение - канкаренси интуитивно понятнее прочих языков, изи ту лерн - хард ту мастер. Но писать что-то сложное на нем - больно, но можно
Джава
>>067483
Добавили в версии 1.18 1,5 года назад
https://go.dev/blog/go1.18
Пытался поумничать, а в итоге не умеешь даже гуглить лох
Котлин/Джава, шарп.
Можно еще натянуть всякую динамикодресню типа жопоскрипта и петухона, если будешь типами покрывать (например jsdoc или тайпскрипт)
Да я уже нашел, именно по первым статьями рассказывалось какие они будут, а есть или нет, не говорилось.
Можно было не петросянить и сразу сказать, ведь я упомянул что не стебаюсь. Какая-то травма у вас
А я просто подумал что ты тупой, а ты просто с чувством юмора оказывается
Это так?
Правда что изучение Golang перспективнее в разы?
Походу инфоцыгание прощупали новую почву. Даешь 1000 соискателей на одном место как питоне.
Java - это 99% энтерпрайз, финтех +легаси какое-то
Проблем найти работу нет. Го - 99% это маркетплейсы, по крайней мере в российских реалиях. Проблем найти работу нет.
Учи голенг. Самый вкатунский язык. Вакансий для джунов и стажёров огромное количество.
Ты настройки наверное неправильно выставил. Сейчас нулевых вкатунов на гошку хайрят и со старта 100к. А в треде всё врут про опыты и тд.
*djanGo
Никакой. На голенге пока не изобрели нормального фреймворка. В каждой компании свой велосипед.
Ты можешь просто посмотреть сколько вакансий на джаву и на го
А ты вкатился?
Конечно серьёзно. Вот например наша компания ищет стажёров нулевых, лишь бы пришли учиться. Образование, возраст, опыт вообще похуй. Спасибо что пришёл, вот твои гроши. Так все бьются лбом в джаву, питон, сишорп, когда вот рядом дверь в голанг открыта. Компанию не скажу, ибо деанон. Боюсь, что к нам не залетите, так как сотни других кабанов пылесосят всех, кто желает учить голанг. Хаир очень ласковый, берут любого с улицы. Нужно просто захотеть.
Бля буду, всё правда. А джаву со спрингом забрасывай. Это легаси и там только с опытом берут.
В условиях высокой конкуренции много резюме. Твои проекты не посмотрит никто. Чтобы выделиться, надо накрутить опыт. Лучше работай в этом направлении. Подделай резюме, ходи по собеседованиям, запоминай вопросы.
интересно, конечно, но разве такой обман не обнаруживается после вопроса "а что вы делали на предыдущем месте работы?" + пары дополнительных уточнений. Да и для себя наверняка полезно проекты реализовывать
Поэтому гуляешь по собеседованиям и учишься убедительно обманывать. Посмотри как описывают опыт другие кандидаты, заучи наизусть, как будто сам всё делал.
>Твои проекты не посмотрит никто.
Я всегда смотрю проекты если они есть в резюме. Просто не надо показывать хело ворлд по мануалу, а если это что-то более сложное то это только плюс. Можно посмотреть как человек пишет код, пишет ли тесты, какие технологии использует.
на что особенно внимательно смотришь в резюме? Я сам на стажировку планирую устроиться, посоветуй, пожалуйста, как позитивно выделиться на фоне других неопытных претендентов?
Во первых надо сказать, что последний раз я отбирал резюме 4 года назад. Сейчас я в большой корпрорации и у нас процесс так устроен что разбором резюме занимаются херки. А я только собеседую буду собеседовать когда найм откроют и пишу фидбек.
А когда я сам смотрел резюме, я смотрел на опыт и на технологии, насколько это релевантно тому что мы используем. И в целом пытался понять уровень кандидата. На тот момент мы 90% кандидатов звали на первое интервью по телефону. 30 минут поговорить про опыт, пара технических вопросов и пара вопросов от кандидата. Дальше если человек понравился звали на очное, если были сомнения могли дать тестовое, или отказ. Но мы джунов без опыта почти не брали.
вот кстати вопрос, есть ли у контекста дроч на регистры поля структуры? чтоб они начинались не с маленькой а с заглавной буквы? а то пытался прописать прямо из модела поля структуры, в моделе пишет что они не юзаются когда как при выполнения запроса и вставки данных тот выдает ошибку что нихуя тебе не будет, хотя импорта и сами поля все в точь точь прописаны, обозначил поля заглавными все стал видеть
>вот кстати вопрос, есть ли у контекста дроч на регистры поля структуры? чтоб они начинались не с маленькой а с заглавной буквы?
Ты бы доки по языку почитал бы. Идентификатор написанный с заглавной буквы виден за пределами пакета. Подчеркивания не используются, Идентификатор принято называть camel case.
чувак ты серьезно, это в любом курсе по гошке есть, что есть поля с большой буквы, то они доступны для экспорта в другие пакеты, если нет, то нет
После написании ответа прочитал на счет этого, и оказалось да, это общепринятая вещь которое есть не только в Go. Я Go в частности по структурам на gobyexample гобайпример учил https://gobyexample.com/structs
Может ты хотя бы Go Tour прочитаешь? Да-да, тот самый на который ты подумал что он для дебилов, но ты же слишком крут для него и пропустил
Как то глупо полагать что человек при изучении чего-либо пользуется только одним ресурсом, вроде бы я не просто так указал что конкретно при знакомстве со структурами в Go, я использовал определенный материал который до этого уже указывал, и в примерах которых поля пишутся не с заглавной буквы.
Go tour это базовая база, проходится за вечер под пару банок пива или за пару дней если с кодом из примеров играешься и ты бы уже не задавал подобных вопросов
По правде сказать, вопрос не был направлен на разрешения какой либо проблемы, просто хотелось узнать мнение людей, а так за рекомендацию спасибо.
Как бы то не было, у джавы число вопросов уже на этапе заполненности и падает общее число у всех, а го за десят лет еще с оси х не вылез.
Если у жабы есть капитал кода и спрос, то го это язык микросервис, который заменяет за неделю, жопоскриптерами.
Интересно зачем жабодебилы постоянно приходят позориться в готред? Тут одна половина это свичеры с джавы, а друга с пхп, тут люди прекрасно понимают как обстоят дела в индустрии
>Тут одна половина это свичеры с джавы, а друга с пхп, тут люди прекрасно понимают как обстоят дела в индустрии
>Поработал в 1,5 говноконторах
>@
>Стал экспертом по индустрии
ну справедливости ради я так могу сказать +- про все финтех проекты где работал, в банках все оче друг на друга похоже
Ну так весь финтех переманивает друг у друга сотрудников, потому что нам нужен сотрудник с опытом работы в финансовой сфере. Эти сотрудники приносят с собой подходы которые они выучили в другом финтехе. Вот и получается, что благодаря перекрестному опылению, схожие подходы воспроизводятся в разных компаниях.
Это лёгкий для чтения язык. Никакой магии, никакой скрытой логики - всё на виду.
да нихуя.
Потому что его надо называть голованг
Мне не нравится как надо добавлять что-то в список или в мапы. Выглядит жутко и неприятно.
Надо постоянно обрабатывать ошибки. Занимает, наверное, половину всего времени.
Ощущение, что нужно постоянно велосипедить.
В целом кажется, что это какой то недопитон, который создавали прокуренные шизы. Ну тут уже субъективщина. Вообще не пынямаю, за что его любят.
> Мне не нравится как надо добавлять что-то в список или в мапы
Экхм, а тут-то что не нравится?
> Надо постоянно обрабатывать ошибки. Занимает, наверное, половину всего времени.
Это сишечка с горутинами. Не проверил errno - у тебя креш.
> что это какой то недопитон, который создавали прокуренные шизы
Даже близко нет.
> Вообще не пынямаю, за что его любят.
За простоту, быстрый вкат, относительно простую конкурентность и кроссплатформенность.
Потому что его создавал чел из Белл лабз, это натурально заря эры ПК. При этом он мог себе позволить не оглядываться на комьюнити и гнуть свою линию спасибо деньгам гугла. Для человека который начинал кодить в машинных кодах, даже for range это неибаццо какой синтаксический сахар.
Ага, легкий для чтения.
Просто напомню, что "лсп" (а точнее на порядок его более мощная версия) появился в лиспах ещё в 80-ых годах. Ну так, к слову о тулингах.
>За простоту
Но го - сложный язык с кучей корнеркейсов, с уже огромным слоем легаси, да даже парсер у него теперь уже неоднозначный, прям как у дидов в си.
Скачал я этот ваш го часа 3 назад, решил, что было бы неплохо освоить. Потому что пробовал раст и показался говниной какой-то
Ниче не читал, решил, что лучшим способом будет - сделать типа эхо-сервер.
В общем. Накидал https://pastebin.com/mfeq3y39
Собственно. У меня теперь вопросы.
1. Как тута код по разным файлам раскидать?
2. Как тута подождать завершения этих вот рутин? Создалось впечатление, будто это какое-то fire and forget, но это же не всегда ОК
3. Как классы делать? Я чет вообще не смог нагуглить классов. Ну, если классов нет, то можно ли как-то структуры расширять?
4. Какие тут есть аналоги блокирующих-конкурентных коллекций? Или надо мутексы и вот это вот все делать? Просто я хотел типа таблицу соединений намутить и не понял как это сделать при условии, что там же получается куча потоков и все такое? Или вся эта фигня с рутинами в одном потоке крутится?
5. Как DI организовать? Ну, типа, чтобы я сконфигурировал и нужному сервису нужные зависимости прокинулись.
6. Какие тута есть ОРМ?
7. Что есть для работы с json-файликами? Я просто хотел конфиг туда вынести, и чет тоже не нашел, а парсить руками было лень.
В таких простых задачах горутины вообще не нужны, достаточно одного потока. Будет работать быстрее. И процессы убиваются через стандартное Ctrl+C оно же SIGINT, не надо крутить цикл как у тебя в main.
Горутины используются, когда ты делаешь запрос на другой сервер с таймаутом и долго ждешь ответ. Можно нафоркать условные 1000 процессов, можно сделать через горутины, производительность будет одинаковая.
И где куча вкатунских вакансий?
Поискал в ДС, всё что нашёл
https://hh.ru/vacancy/88590475?query=golang+Junior&hhtmFrom=vacancy_search_list - нужен опыт работы 7 месяцев
https://hh.ru/vacancy/93069676?query=golang+Junior&hhtmFrom=vacancy_search_list - нужен опыт работы 2 года
https://hh.ru/vacancy/90024969?query=golang+Junior&hhtmFrom=vacancy_search_list - нужен опыт работы с СУБД
https://hh.ru/vacancy/92506075?query=golang+Junior&hhtmFrom=vacancy_search_list - нужен опыт работы с СУБД
https://hh.ru/vacancy/94218872?query=golang+Junior&hhtmFrom=vacancy_search_list - единственная вкатунская вакансия, где ищут раба забесплатно.
>Всё на виду
a1 := make([]int, 0)
a2 := []int{}
a3 := *new([]int)
Это три разных способа создать пустой слайс. Зачем?
найс последняя вакансия, 3 месяца рабства без выходных, без оплаты, еще и не факт, что в штат возьмут)
Первые два варианта есть в любом языке, аллокация заданного размера и аллокация с инициализацией.
Третье просто универсальный синтаксис создания любых типов. Удивительно, что он и для слайсов работает, да?
https://gleam.run/
очевидно чтобы не забыть его туда кинуть
У тебя может быть сильно больше одной точек выхода из функции if err != nil.
Панику можно обработать только в defer.
>Как DI организовать
Создаешь структуру App, где будет храниться указатель на логер, на пул соединений с бд, конфиг итд. И уже в NewApp функции создаешь все свои сервисы, после чего прокидываешь в них все нужные зависимости.
Как на жабе в спринге у тебя все автоматом подтягивается из spring-context хранилища объектов, так тут ты все ручками распихиваешь куда нужно.
>>080964
>Какие тута есть ОРМ
Есть Gorm. Но вообще орм не принято использовать. Да и в целом писать бизнес-логику с походами в базу на го это плохой выбор. Лучше котлин или жабу со спрингом для бизнес задач брать.
>>080964
>Что есть для работы с json-файликами
json.Marshal/Unmarshal
Да как-то хайп на гоуленг сошел я вижу.
Год-полтора назад нанимали на гошечку гораздо активнее.
Видимо наелись.
Ну ты же на С или С++ не будешь писать энтерпрайзные круды, верно?
А вот какой-нибудь видеостриминг, файлопомойку, свою реализацию S3 сервера, кубернетис операторы да и даже движки субд неплохо на го пишутся.
Понятно, что просто 0 возвращать было бы очень странно - хуй поймешь, сумели ли привести интерфейс к инту или нет, поэтому бросают панику. Но разве не проще ли было сделать, как в остальном языке, чтобы попытка приведения значения интерфейса к нужному типу обязательно возвращала value и err. Тогда бы второй вариант попросту бы не скопилировался и не было бы нужды бросать панику.
https://go.dev/play/p/FSD16nC8v1A
>Да и в целом писать бизнес-логику с походами в базу на го это плохой выбор. Лучше котлин или жабу со спрингом для бизнес задач брать.
Святая толстота
>Создаешь структуру App, где будет храниться указатель на логер, на пул соединений с бд, конфиг итд. И уже в NewApp функции создаешь все свои сервисы, после чего прокидываешь в них все нужные зависимости.
>Как на жабе в спринге у тебя все автоматом подтягивается из spring-context хранилища объектов, так тут ты все ручками распихиваешь куда нужно.
Надо еще как-то разресолвить граф зависимостей и порядок инициализации, а так говно вопрос конечно.
Потому что не стали делать настолько глубокий анализ, сказано что interface{} значит что может быть что угодно.
>сказано что interface{} значит что может быть что угодно
Это понятно. У меня вопрос, почему сама операция приведения интерфейса к типу не возвращает два значения всегда. Чтобы нельзя было написать i := x.(int). Чтобы можно было написать только i, err := x.(int). Ну или i, _ := x.(int). Так куда более логично с точки зрения консистентности самого языка.
Таков путь.
а что если бы func x() (T, err) можно было вызывать как y := x() и при err != nil автоматом бросалась паника?
Ты только что эксепшены. Это не говей. Говей - это придумать велосипед на квадратных колесах и всем рассказывать, что так даже лучше, когда ты едешь и сидушка постоянно бьет по заднице.
>У меня вопрос, почему сама операция приведения интерфейса к типу не возвращает два значения всегда.
Это достаточно распространенный в го подход - один метод возвращает значение и err, второй метод обычно называют mustXxx()только значение и панику в случае ошибки. Это нужно чтобы упростить инициализацию переменных в случаях когда ты уверен, что должны быть правильные данные. Например ты хочешь создать тип Regexp, регулярка не меняется тебе не нужно каждый раз писать обработку ошибки, пусть паникует если регулярка с ошибкой.
>>084086
>а что если бы func x() (T, err) можно было вызывать как y := x() и при err != nil автоматом бросалась паника?
Это провоцирует говнокод. Ошибки бывают разные, есть ошибки которые вызваны входными данными и там теоретически можно их избежать, а есть ошибки вызванные средой исполнения, например ошибки чтения по сети. И если разрешить их не обрабатывать то начнут писать говнокод который работает до первой сетевой или дисковой ошибки.
Первый:
Дёргаем в main функцию из соседнего пакета, которая возвращает указатель на бд/логгер/говно и передаём этот указатель по всему калопроводу через аргументы до самых отдалённых унитазов.
Второй:
Дёргаем в main функцию из соседнего пакета, которая ничего не возвращает, а записывает указатель в импортируемую переменную того пакета. Появляется возможность сделать db := baza.Bazyuha только в самом далёком толчке без протаскиваний по калопроводам.
Почему в большинстве гайдов используют первый стул?
>Почему в большинстве гайдов используют первый стул?
Потому что так больше писать надо, а это говей.
Так ты явно указываешь откуда берётся переменная, проще для понимания. Нет никаких волшебных знаний, что надо дёрнуть функцию А, а потом прочитать переменную Б, что пиздец как не очевидно.
>>084789
Понимаю. А как тогда в фреймворках сторонний логгер протянуть? Возьмём для примера Gin. В настройках можно задать, чтобы фреймворк плевал свои внутренние логи (типа инфо гет 200) в встраиваемый логгер. При этом сами обработчики находятся в другом пакете и вообще не знают "а чо там у х фреймворка с логами". Аргументы в них не пробрасываются ибо route.GET("/get", handlers.Pook)
>как тогда в фреймворках сторонний логгер протянуть
Если интерфейса под это нет, то есть места куда можно просунуть логгер, то очевидно что никак.
В этом случае допустимо сделать в самом начале каждого обработчика log := logger.Log и нарушить SOLID или за такое ебут?
Если ты пишешь фреймворк и хочешь пользователям управлять логгированием, то я бы сделал так: создал интерфейс LogWriter, который бы умел писать конкретные сообщения:
> LogMessage(level Level, msg string, params ...any)
и метод SetLogWriter(). По дефолту инициализировал бы его системным LogWriter.
И методы
> myloger.Info(msg, ...params)
которые бы уже вызывали тот LogWriter который есть. Ну и всё это упаковать в отдельный от фреймворка пакет, с документацией.
Хочу перекатиться в го из джавы есть в РФ работодатели которые берут опытных жавистов на проекты с го?
Язык +/- освоил, но нужна осмысленная практика с ревью, задачами и лучшими практиками которые нарабатываются только в работе.
Я бы залетел, но не учил гуланг пока. Насколько реально залететь куда-нибудь с гулангом без глубокого знания фреймворков всяких, во что компилируется язык и т.д. ?
Двачаю, сначала пусть отучатся писать в enterprise edition стиле и потом уже приходят
Поясните про пхп в го. Постоянно как речь не заходит про го, то сразу всплывает пыха и наоборот в пыхо сообществах го разраб это как новый этап в развитии пхп погромиста.
Также листал вакансии на хх и постоянно встречаю требования го+пыха
В чем связь? Почему эти два языка идут рука об руку? Почему не го+питон или го+джава или ещё чтото
? За что тебя сегодня мама наругала?
>опытных жавистов
А кому вы нужны? Тем более ты скуфидон. Сколько не работал на гоулэнг проектах, везде команда из упругих зумеров до 25-27 лет. У нас даже лид на текущем проекте 25-летний парень. Это бигтех, если что. Да и твой "опыт" здесь не нужен. Мы в прошлом году уволили целый отдел таких скуфидонов, которые писали на гоулэнге как на жабе, лол
>SOLID, так тесты проще писать
Вообще нет, лол. Просто пишешь рест контроллер, из него дергаешь сервисный класс, затем из сервиса дергаешь репозиторий и все. Это нормально, когда сервисный класс имеет 15-20 зависимостей и ты туда дописываешь нужную логику и добавляешь фитчи
Лаконично
Проиграл
Авито многие свои сервисы с php, питона и джавы переписала на го. Но изначально основная кодовая база у них была на пхп.
Они постоянно проводили конференции, где рассказывали как круто было отказаться от пхп в пользу гоуленга.
Видимо остальные пхп конторы тоже начали их опыт повторять.
>А чего не так с Graal Native Image
В том, что его нигде не используют. Это мертвый проект, увы.
Причина - нет нормальной поддержки рефлексии.
А любая крупная либа в jvm мире это тонны рефлексии. Как там, spring native поживает? Go как раз умеет компилироваться в бинарь и при этом в нем есть поддержка рефлексии полноценная.
Ты уверен что на тот пост ответил?
Ты не понимаешь, это го-вей!
Надоело сидеть за сотыгу в своём НИИ с дедами-пердунами.
Коллеги посоветуйте для кафки норм либу
Технически в го ничего сложного нет, выучить не проблема. Разве что "сопутствующие" технологии - докер, кубер, рест, грпц и т.д. надо получить.
Тут скорее вопрос в том, сможешь ли ты себя продать. Убедить хрюшу позвать тебя на собеседование. Вот тут надо будет вылизать резюме и научиться красиво пиздеть про свой опыт. Сначала у тебя, почти наверняка, не получится, но со временем вполне реально.
segmentio/kafka-go юзаю сейчас на проекте, гораздо лучше sarama, прямо на порядок более человечески сделано
Меня не смущает то что я потеряю в зп первые пару лет, и придется нихуево попотеть, но на выходе если через пару лет стать мидлом то будут одни плюсы. Так как кнопки красить уже не могу, подташнивает.
Как вообще смотрят на таких вкатунов? Как на полный долбаебов? Я просто представляю если ко мне придет на собес бекендер с 10 лет опыта на позицию джуна. Мой первый вопрос будет ты че ебанутый?
Челы с 10 летним опытом минимум на миддла+ должны идти в го, иначе они хуйней занимались все эти годы.
Лучше пробовать, чем ничего не делать
>Хочу перекатиться в го из джавы есть в РФ работодатели которые берут опытных жавистов на проекты с го?
Перекатился на го пока работал жаба-макакой в Сбере. Без потери в зп. Синтаксис и билд систему к тому моменту уже знал, но опыта работы с продакшн реди либами было мало.
Несколько нюансов, отличие от жабы:
Билд система непривычная, много нюансов особенно после грейдла/мавена, нужно изучить детально с самого нуля, причем это важнее даже чем знание самого языка.
Рантайм позволяет в быстрый TDD без пиздоебства: файл сохранил -> тесты пробежали за миллисекунды/секунды в худшем случае.
ГоЛанд объективно хуже идеи в поддержке языка, я пересел сначала на ВСКод, потом на вим (lunarvim + gopls).
Горутины ебейшая вешь, но очень легко выстрелить в ногу особенно в вебдеве.
Лично я дрочу на контейнеры FROM scratch. Получи контейнер с полностью функциональным рест апи размером в ~30мб.
Пока регулярно приходится изобретать велосипеды. В отличии от жабы, пока нет библиотек буквально на все случаи жизни.
P.s: Сейчас в Озоне, никто за джавизм не унижает и не ловит, ревью прохожу нормально. Большинство коллег перекатилось в Го.
>>088139
Такой хуйни пока не встречал. Адекваты везде приветствуются. Мифический стиль написания на го вырабатывается за месяц, если кроме жабы умеешь в другие языки. Может за 2 от силы, если закостенелый даун.
Только ты за эту сотыгу с дедами-пердунами, наверное, нихуя не делаешь толком, а тут за две уже ебать плотно будут во все щели.
продебаж go get с флагами -v или -x, хз какой из них.
а так в целом GONOPROXY, GONOSUMDB, GOPRIVATE, .netrc, .ssh/config это вроде все места где ты можешь проебаться
Перекатился с Явы на Go внутри Сбера, или в Сбере писал на Java, а в Озон пошёл собеседоваться на Go?
Зачем идти в озон, если там жуткая потогонка за копейки? Сенька литерально получает 200к и там нет премий и бонусов как в сбере
https://go.dev/tour/generics/2
Гугли что такое связный список linked list
> в интернете нет нифига
Плохо гуглил, там же написано что это linked list, инфы по теме море
https://go.dev/play/p/uOJaBOgN_ZM
Нижняя граница мидла в озоне 230к насколько я слышал от Vlad K. Сам в озон хочу через полгодика попробовать вкотиться на две сотыжки...
Вопросы:
1)Если гулэнг норм живет без виртуальной машины, то нахуя vm делали для джавы и шарпа? Кто из них долбоеб по итогу?
2)Горутины под капотом работают так же, как и kotlin корутины?
А то в kotlin я могу почитать его байткод на джаве, т.к. он типа сначала в жабу компилится.
Там suspend функции просто return-ом флаг кидают, чтоб функция не блочила выполнение, а на фоне уже операция работает, которая при получении результата возвращает результат в коллбэк, который в параметр функции передается, но кодер видит лишь suspend слово вместо колбэка.
Сама корутина с асинхронными операциями представляет из себя объект, у которого invoke вызывается время от времени, а внутри invoke стейт машина, которая в зависимости от состояния выполняет последовательно операции асинхронные, обять же не блокируя выполнение, т.к. return кидает флаг просто, а результаты если что в колбэк объект кидаются и вызывают invoke снова.
Я так понял слово go - это аналог suspend fun в котлине, но при этом не надо заранее красить асинхронные функции. Получается компилятор go тупа гигачад, который каким то хуем меняет поведение одной функции в разных местах, смотря на ключевое слово?
Прост когда увидел go someFunc() без всяких suspend и колбэков, перевозбудился по ошибке
Зачем? Ты хочешь поменять удобный инструмент на творчество душевнобольных чтобы что? Вместо удобных асинков для людей будет ебаное месиво из горутин и каналов, в котором ты утонешь нахуй.
Вот тут https://medium.com/@brucewangno1/implementation-details-of-goroutine-5286fc0e9651 хорошо написано про горутины.
>Горутины под капотом работают так же, как и kotlin корутины
Предполагаю, что в целом нет. Корутины это стейт машина. Горутины это в первую очередь планировщик.
>>094481
Асинхронных функций тут нет. По сути горутину лучше воспринимать как Thread из мира джавы. И go func() означает, что функция будет запущена в новом треде. И чтобы выполнять коммуникацию между тредами используют блокирующие очереди - каналы. Просто так получить значение из функции, которая запустилась в отдельном треде, разумеется невозможно, так как считай, что у ее горутины стек другой.
Можно не использовать их, а просто через sharing memory по старинке с мьютексами выполнять общение потоков, но это считается плохим подходом.
>функция будет запущена в новом треде
Не просто запущена, а поставлена в очередь и запущена потом когда-нибудь, когда освободится воркер. Твой же код продолжит выполнение со следующей строки, а не будет ждать как с async. Чтобы сделать как асинк, надо ебаться с каналами, это говей. Можно было скрыть каналы под капотом, как в других языках, но это не говей, ты должен заебаться.
>Зачем?
На ноде практически нет вакансий, а те которые есть - мидлы+/сеньоры с 3+ годами опыта и ебанутой конкуренцией на место. Ну либо ИП Кабан Кабаныч и крипто-блокчейн параша. На ГОшке же куча вакух с годом опыта, конкуренция меньше, ЗПха больше.
Что тебе мешает написать 3 года опыта? Что тебе мешает вкатиться в фулстек на ангуляре? Фулстек на удаленке - это вообще работа мечты, можно ненапряжно делать сайтики разным жлобам и жить на солнечном берегу в деревушке где-то в Болгарии, а не душится в офисе авито.
>Что тебе мешает написать 3 года опыта?
Лучше крутить опыт на ГО, чем на Ноде. Ибо на ГО всё равно вакансий в 7-8 раз больше и конкуренция меньше. Я же не один умный такой опыт крутить буду
>фулстек
Ебал я рот фронтеда, в жизни к этом калу не прикоснусь
Так потребление из канала это и есть await по сути. Напрягает только то, что каналы перекидывать надо туда-сюда.
С одной стороны избавляемся от suspend слова, или от Task await как в шарпе, с другой стороны мы теперь должны каналы кидать везде параметрами. Шило на мыло короче, хз. Интересно можно было бы скрыть каналы по типу того, как suspend функции скрывают колбэк под капотом в Kotlin
> с другой стороны мы теперь должны каналы кидать везде параметрами
Не должны. Например аналог await Promise.all в го выглядит так:
https://go.dev/play/p/C_5UOmjcE_c
А каналы это больше для ивентов/потоковой обработки
Для получения результата из функции каналы использую, как я понял, так что их надо передавать, если функция не анонимная, как у тебя в примере.
У тебя WaitGroup неявно передается в твои лямбды. Если ты сделаешь их именованными функциями, WaitGroup надо будет передавать через параметры.
>избавляемся от suspend слова, или от Task await как в шарпе
Плохо зделоли тупо. В сишарпе await сразу бросается в глаза, ты пробегаешь по коду и видишь точки ожидания. В голанге эти ебучие стрелочки воспринимаются, как визуальный шум и мусор. Говей такой говей.
Шарпомуха, не бузи)
Куда я попал.
Ну так поясни за свои каналы, умник епты. По поводу await-а хз что там не понимать, ты о чем вообще?
Чел, каналы это полное говно. -30% производительности на ровном месте. С мьютексом такой хуйни нет.
>>096194
Ликбез для самы маленьких и тупеньких channel это тупо блокирующая очередь, аналог BlockingQueue в Java, BlockingCollection в C#, producer(ы) пишет в очередь, consumer читает(ют). Если размер очереди ограничен, то на записи возможна блокировка. Если данных в очереди нет, то на чтении возможна блокировка. В зависимости от API можно читать и писать не блокируясь.
sync/await это вообще нихуя не про блокировки и межтредовое взаимодействие. sync/await это точки где код отдает управление пранировщику шарпорутин. В этих точках пранировщик шарпорутин получает управление и решает, что делать дальше: продолжить выполнение, или продолжить выполнение другой шарпорутины.
По поводу каналов
>>3095425 →
>Что касается каналов, то в прикладном коде они появляются, когда ты решаешь что-то распаралелить на несколько горутин. Ну так у тебя и в котлине будет тоже самое даже есть каналы https://kotlinlang.org/docs/coroutines-and-channels.html#channels помимо каналов есть и другие способы, но сути это не меняет В Java у тебя будет Structured Concurrency или старые добрые очереди.
Не в курсе что там в C#, но sync/await это точно, не про распаралеливание задач.
Поридж, ты тупой.
Как работают каналы? На стрелочке горутина делает return и рантайм ставит ее в очередь канала. Когда в канале появятся данные, рантайм возьмет горутину и переставит в общую очередь, дальше ее подхватит воркер и продолжит выполнение.
Как работают асинки? Та точно так же, блять. В точке await метод делает return, рантайм ставит метод в очередь, когда у таски появится флаг ок, рантайм продолжит выполнение метода.
Технически и горутины и методы сделаны как конечные автоматы. И в го, и в дотнете используются очереди с блокировками. Потому что, внезапно, это многопоточность, без блокировок никак.
Я знаю как работают каналы в голенге. Не понимаю, почему они так просаживают производительность. Условно, мне нужно асинхронно записать 10к элеменов в массив. Беру 10 потоков и начинаю писать данные с блокировкой мьютексом. Получаю среднюю производительность n. Тоже самое, но с небуферизированным каналом: n - ≈ 30%
доказательства будут?
>Как работают каналы? На стрелочке горутина делает return и рантайм ставит ее в очередь канала. Когда в канале появятся данные, рантайм возьмет горутину и переставит в общую очередь, дальше ее подхватит воркер и продолжит выполнение.
>Как работают асинки? Та точно так же, блять. В точке await метод делает return, рантайм ставит метод в очередь, когда у таски появится флаг ок, рантайм продолжит выполнение метода.
>Технически и горутины и методы сделаны как конечные автоматы. И в го, и в дотнете используются очереди с блокировками. Потому что, внезапно, это многопоточность, без блокировок никак.
Мало того что тупой, так еще и гонору вагон.
Каналы в Го это просто очередь https://go.dev/src/runtime/chan.go максимум, что он может сделать это запарковать тред, и всё. Никаких конечных автоматов там нет и в помине. Треды в го снимаются и прикрепляются к тредам ОС планировщиком горутин, но само выполнение горутины это обычный код без всяких стейт машин. В этом то главная фишка го и состоит - он не красит методы, в отличии от C#.
>Я знаю как работают каналы в голенге. Не понимаю, почему они так просаживают производительность. Условно, мне нужно асинхронно записать 10к элеменов в массив. Беру 10 потоков и начинаю писать данные с блокировкой мьютексом. Получаю среднюю производительность n. Тоже самое, но с небуферизированным каналом: n - ≈ 30%
30% это не такая уж и фатальная потеря производительности, канал более сложная структура чем мьютекс и потому работает медленнее. Он под капотом мьютекс и использует https://go.dev/src/runtime/chan.go с чего бы ему быть быстрее?
В хайлоаде очень даже чувствительно. Зачем тогда вся эта пляска с каналами? В какой ситуации они являются киллерфичей по сравнению с мьютексом?
1. В хайлоаде важнее всего масштабируемость, а не TPS/GHz.
2. Ты взял какой говнопример и пытаешься, на основе его что-то доказать. Для разнообразия можешь взять те же 10 горутин, но синхронизировать их не через мьютекс, а через атомик increment and get для получения индекса. А потом ещё добавить оптимизацию инкремент делать не на 1 а на N. И вуаля, мьютекс говно по перформансу.
Теперь ты знаешь, что такое говей. На любую критику обязательно прибежит шиз и будет доказывать, что так даже лучше и только выиграли. Просто почитай этого ебанутого, он неиронично предлагает писать примитивы синхронизации и полгода выгребать баги на проде которые в нормальных языках идут из коробки.
Надо было в Раст вкатываться, там тоже шизы, но они хотя бы образованные.
package main
import (
"encoding/json"
"net/http"
"log"
)
type RequestBody struct {
Field1 string json:"field1"
Field2 int json:"field2"
}
func main() {
http.HandleFunc("/example", handleExample)
log.Fatal(http.ListenAndServe(":8080", nil))
}
func handleExample(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Only POST method is allowed", http.StatusMethodNotAllowed)
return
}
var reqBody RequestBody
err := json.NewDecoder(r.Body).Decode(&reqBody)
if err != nil {
http.Error(w, "Invalid request body", http.StatusBadRequest)
return
}
// Передача данных в сервисный слой
serviceResponse := someServiceFunction(reqBody)
// Отправка ответа клиенту
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(serviceResponse)
}
func someServiceFunction(reqBody RequestBody) interface{} {
// Здесь можно реализовать логику обработки данных из запроса
// и возвращения результата
return map[string]interface{}{
"message": "Data received successfully",
}
}
Настоящие контроллеры выглядят примерно так? Нельзя пост метод где-то прописать вместо того чтобы вручную проверять?
package main
import (
"encoding/json"
"net/http"
"log"
)
type RequestBody struct {
Field1 string json:"field1"
Field2 int json:"field2"
}
func main() {
http.HandleFunc("/example", handleExample)
log.Fatal(http.ListenAndServe(":8080", nil))
}
func handleExample(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Only POST method is allowed", http.StatusMethodNotAllowed)
return
}
var reqBody RequestBody
err := json.NewDecoder(r.Body).Decode(&reqBody)
if err != nil {
http.Error(w, "Invalid request body", http.StatusBadRequest)
return
}
// Передача данных в сервисный слой
serviceResponse := someServiceFunction(reqBody)
// Отправка ответа клиенту
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(serviceResponse)
}
func someServiceFunction(reqBody RequestBody) interface{} {
// Здесь можно реализовать логику обработки данных из запроса
// и возвращения результата
return map[string]interface{}{
"message": "Data received successfully",
}
}
Настоящие контроллеры выглядят примерно так? Нельзя пост метод где-то прописать вместо того чтобы вручную проверять?
Ахуел? Больше 10 строк кода, формат уровня b, бредни гопоты. Тебя сжечь надо, а не помощь оказывать.
Вот хороший пример https://go.dev/doc/tutorial/web-service-gin
Гопота не может в код, генерит какую-то хуйню.
Кто-то пользуется гином? Я думал у вас тут все на стандартной библиотеке делается
Не надо ставить джава-рантайм нужной версии.
Более быстрая разработка по сравнению с жабой. Иногда на порядки быстрее. Ну и конечные сервисы значительнее быстрей чем на жабе. Достаточно посмотреть на сервисы вроде яндекс.маркета или недвижимости, а потом открыть авито недвижимость или озон. В целом на проектах где пишут на гоу молодая и энергичная команда до 25-27 лет. На жабе обычно старичье 30+ что-то там пердит в попытках расставить нужные аннотации спрэнг фримверка. Пока одни за неделю выкатывают новую фитчу и лутают бабулес, вторые 2 месяца настраивают хубирнейт и спрэнг фримверк, а потом три месяца дебажат нюлы.
Про скорость уже писал. Сервис на гоу стартует за +- секунду-две, пока сервис на спринг буте поднимается несколько минут и раз за разом фейлится где-нибудь в конце т.к. ты снова поставил не ту аннотацию и у тебя наебнулся контекст т.к. рефлекшен кругом, лол
>Особенно повеселило про яндекс маркет
>джаваскуфидон не выкупил однослойную
Чел... Объясняю.... ямаркет и недвижимость написаны на жабе + спрэнг бут - это медленные сервисы и глючные. Авито и озон написаны на гоу - это круто и быстро. Возвращайся дебажить нюлы по полгода
Озон заебись,без нареканий
Авито это распреденный монолит, где всё раздробили на наносервисы, примерно по сервису на одного бекендера, а ещё там много Легаси на пыхе
Рефлексия джавы не позволяет компилировать код. Рефлексия позволяет создавать объекты, читать/писать значения полей, вызывать методы. Всё тоже самое может рефлексия в Го.
В моем случае я создаю джавовский Callable(поток возвращающий результат) передавая ему содержимое нужного класса как одну большую строку. Не подскажешь в какую сторону смотреть в рамках голанга?
У меня система обрабатывает бесконечные потоки данных по разным источникам(сетевые коммутаторы). Для каждой версии прошивки и для каждого поставщика в частности пишется парсер(на джаве),далее этот парсер создается и запускается с помощью рефлексии на другом микросервисе(тоже на джаве). То есть существует много потоков уже и также относительно часто добавляются новые,также есть потребность в изменении существующих парсеров в соответствии с требованиями бизнеса. Нынешняя система полностью удовлетворяет требованиям и переписываться на го не будет (хотя кто знает что будет через пару лет),спрашиваю в целях мысленного эксперимента. Как ты понимаешь редеплоить сервис при добавлении нового потока нельзя
И как бы ты реализовал изменение и добавление новых обработчиков без редеплоя?
>И как бы ты реализовал изменение и добавление новых обработчиков без редеплоя?
https://en.wikipedia.org/wiki/Over-the-air_update
Обновление поступает в виде delta-файла, сравнивается старая прошивка и новая. Потом применяются изменения. Опционально можно отключать функционал на время обновления.
Сравнение прошивок не нужно,там нет обратной совместимости и в помине. Два потока одного поставщика, даже с разными версиями это два независимых потока. Тут видимо нужно прояснить пару моментов. С вышек приходят данные о событиях в сети(набор номера,сброс,перенаправление и тд)+метаинформация. Данные лежат в жатом пережатом+зашифрованном виде. Документация оборудования описывает как эти данные считать. Если важно,то события поступают в файлах с байтовым содержимым,либо с содержимом в формате asn1. На выходе данные можно представить в виде жсона,хмл или любого другого формата
> добавление новых обработчиков без редеплоя
Сама постановка вопроса неправильная. Рано или поздно нужно будет рестартарт сделать, не говоря уже о всяких авариях. Первое что мне пришло в голову это очередь, чтобы консьюмеры можно было создавать динамически и делать rollout restart, а так нужно больше подробностей
>И как бы ты реализовал изменение и добавление новых обработчиков без редеплоя?
В гуланге так не делают.
Это в джава у тебя если динамическая загрузка и линковка кода. Есть джит который весь код прям в рантайме анализирует, оптимизирует и компилирует в нативный код. Т.е. у тебя код который есть с самого начала, код который загружен потом и код который сгенерирован налету вообще не различаются по перформансу.
А гуланг это статически компилируемый язык, никакой компиляции и линковки в рантайме нет. Максимум что тебе доступно это интерпретатор, сам понимаешь перформанс там далек от нативного кода.
В целом, на гуланге надо реализовать отделение бизнес логики от логики парсеров. И сделать так, чтобы парсеры можно было легко и бесшовно редеплоить не задевая остальную часть.
и ьы не ответил >>099480
Не знаю что это
> Сама постановка вопроса неправильная.
Постановка буквально требование бизнеса
> Рано или поздно нужно будет рестартарт сделать
С чего ты взял? У нас рестарты происходят раз в Х месяцев когда добавляются улучшения в сервис который парсеры запускает
> Не говоря уже о всяких авариях.
У нас авария,в существующей архитектуре,может быть только в рамках парсера который запускается внутри сервиса. Это не затрагивает не только сервис,который это запускает,но и другие потоки от этого тоже никак не страдают
> Первое что мне пришло в голову это очередь, чтобы консьюмеры можно было создавать динамически и делать rollout restart, а так нужно больше подробностей
Вопрос вообще не про потребителей. Если в крации:
1)Парсеры это классы(джава,го,не суть). Для простоты понимания можешь представить что на момент нашего общения существует 5 парсеров. Каждый выводит на консоль число. Первый парсер выводит 1,второй 2 и тд. Вывелось число—ты молодец и обработал одно событие.
2)Эти 5 парсеров работают и бесконечно срут в консоль своими числами.
3)К нам приходит потребитель данных и говорит что хочет чтобы по первому потоку хочет видеть в консоли число не 1 а 10.
4)Потом приходит новый заказчик и говорит что хочет чтобы мы обрабатывали новый поток(сделали парсер 6 который будет срать в консоль шестеркой)
Основные требования к системе вытекают из пунктов 3 и 4. Как ты понимаешь просто положить 5 классов-парсеров в коде нельзя тк добавление нового парсера или изменение старого потребуют остановки существующего сервиса и добавление/изменение парсера. Существующая же система принимает мету по потоку(откуда взять данные,куда положить и как обработать (класс-парсер)). И для нужного потока просто создает динамически класс из меты и все работает окай. Изменение старого тоже не проблема,стопнули поток,внесли изменения в мету и стартанули заново. Вуаля,новый класс обработчик,но сам сервис никак не изменился. Добавление нового еще проще, достаточно просто написать парсер и все. При каждый из этих движух остальные потоки не останавливаются,как работали так и работают
> Сама постановка вопроса неправильная.
Постановка буквально требование бизнеса
> Рано или поздно нужно будет рестартарт сделать
С чего ты взял? У нас рестарты происходят раз в Х месяцев когда добавляются улучшения в сервис который парсеры запускает
> Не говоря уже о всяких авариях.
У нас авария,в существующей архитектуре,может быть только в рамках парсера который запускается внутри сервиса. Это не затрагивает не только сервис,который это запускает,но и другие потоки от этого тоже никак не страдают
> Первое что мне пришло в голову это очередь, чтобы консьюмеры можно было создавать динамически и делать rollout restart, а так нужно больше подробностей
Вопрос вообще не про потребителей. Если в крации:
1)Парсеры это классы(джава,го,не суть). Для простоты понимания можешь представить что на момент нашего общения существует 5 парсеров. Каждый выводит на консоль число. Первый парсер выводит 1,второй 2 и тд. Вывелось число—ты молодец и обработал одно событие.
2)Эти 5 парсеров работают и бесконечно срут в консоль своими числами.
3)К нам приходит потребитель данных и говорит что хочет чтобы по первому потоку хочет видеть в консоли число не 1 а 10.
4)Потом приходит новый заказчик и говорит что хочет чтобы мы обрабатывали новый поток(сделали парсер 6 который будет срать в консоль шестеркой)
Основные требования к системе вытекают из пунктов 3 и 4. Как ты понимаешь просто положить 5 классов-парсеров в коде нельзя тк добавление нового парсера или изменение старого потребуют остановки существующего сервиса и добавление/изменение парсера. Существующая же система принимает мету по потоку(откуда взять данные,куда положить и как обработать (класс-парсер)). И для нужного потока просто создает динамически класс из меты и все работает окай. Изменение старого тоже не проблема,стопнули поток,внесли изменения в мету и стартанули заново. Вуаля,новый класс обработчик,но сам сервис никак не изменился. Добавление нового еще проще, достаточно просто написать парсер и все. При каждый из этих движух остальные потоки не останавливаются,как работали так и работают
> В целом, на гуланге надо реализовать отделение бизнес логики от логики парсеров. И сделать так, чтобы парсеры можно было легко и бесшовно редеплоить не задевая остальную часть.
Ну да,надо,просто анон вкинул типо он бы пересмотрел архитектуру,вот я и заинтересовался как бы он реализовал требования средствами го ибо текущая архитектура и требованиям по скорости удовлетворяет и для разработчиков очень удобна
собес и экзамен сильно отличались чтоли? и как вообще экзамен всплыл этот?
студент-вкатун
Когда главный скажет, тогда и добавят. Ему из гугла лучше видно. Мы жуки-плавунцы, едим, что насыпали. Сейчас главное не бухтеть, а сплотиться и защищать гошечку от богомерзких джаверов и сишарперов.
Стектрейсы есть https://pkg.go.dev/runtime/debug#PrintStack
>>103106
Пайк наградил и ушёл на пенсию.
>Стектрейсы есть
значит ли это, что не нужно изъебываться над каждой строчкой чтобы обработать ошибку?
да
Ребят, не подскажете, есть ли какой-то способ задать ограничение на количество считываемых с консоли символов?
Например, я хочу записать в string три слова разделенных пробелами, но если записываю, например, четыре, то получаю ошибку
Или, например, хочу записать два числа в int1 и int2 в формате "22 45", но если, например, ввожу "22 45 8", то тоже получаю ошибку. На данный момент 8 уйдет в следующий виток цикла, что мне не нужно
>а что такое? В компиляторе как в 70х бюджет 6 букв на имя функции?
Лимита нет, но авто предпочитает короткие имена. Потому что сам из 70х, и вообще привык в vim работать. А потом всякие додики спрашивают зачем вам IDE? Именно за этим, чтобы писать длинные и понятные имена функций.
Для выпускной квалификационной работы,деревенщина
> Ребят, не подскажете, есть ли какой-то способ задать ограничение на количество считываемых с консоли символов?
io.LimitReader
>Например, я хочу записать в string три слова разделенных пробелами, но если записываю, например, четыре, то получаю ошибку
считываешь в буфер максимальным размером N, сплитишь и валидируешь
>Или, например, хочу записать два числа в int1 и int2 в формате "22 45", но если, например, ввожу "22 45 8", то тоже получаю ошибку. На данный момент 8 уйдет в следующий виток цикла, что мне не нужно
в чем проблема проверить, что ты на 3-й итерации лупа и вернуть ошибку? или вернуть ошибку после парсинга всего инпута?
На днях закончил освоение теории ГО, встал вопрос пет-проектов, хочется уже что-то более осязаемое покрутить. Подскажите, пожалуйста, студентоте без опыта, что берется для пет-проектов и как\зачем\почему
>Подскажите, пожалуйста, студентоте без опыта, что берется для пет-проектов и как\зачем\почему
Не надо делать пет-проекты для других. Делай для себя. Иначе это будет имитация полезной деятельности. Это та же самая показуха, как и когда мэр города начинает красить траву во время приезда президента, срочно ремонтировать дорогу, сажать цветочки и т.д. Он тоже имитирует полезную деятельность. Смотрите какой я важный! Как я много работаю! Тоже самое, показуха в армии, показуха перед выборами и так далее. И в итоге мы имеем то что имеем.
Проблема в том, что я не до конца понимаю что такое пет-проект. Точнее я понимаю, что это примерно, но я не понимаю как их придумывать. Я примерно понимаю, что калькулятор может быть пет-проектом, но как будто в рамках ГО делать калькулятор такое себе. Хочется чего-то прикладного что ли
Так возьми я не знаю, свяжись с каким-то благотворительным фондом. Спасение кошек/собак, лечение деток больных пиздецомой, какие-нибудь слепые. И предложи им свою помощь. Так хоть какая-то польза будет. Щас ты силы тратишь в пустоту. Или лучше вообще ничего не делай. Мир и твой будущий работодатель переживёт отсутствие ещё одного 16431-го калькулятора. Когда к тебе придёт крутая идея, вдохновение, такое что прям глаза загорятся, тогда и запилишь свой пет-проект. А если идей нет, не надо пытаться их искусственно создать. Не можешь срать - не мучай жопу.
Так проблема в том что я не понимаю что можно сделать в принципе. Как можно ждать озарения, если непонятно что я жду. Нет же смысла условную нейронку бахать на ГО, надо что-то более из области го. Вот челик выше в треде писал эхо сервер.
Если говорить про работодателя, то ему понятно, что не нужен мой калькулятор будет.
Вопрос не в том чтобы сделать очень нужную полезную мне вещь, а попробовать покрутить все что я выучил на более менее практической задаче
У нее проблемыНу как проблемы...физически отклонений нет, она полностью здоровый человек. Не найдено ни одной явной причины.
Ну охуеть теперь. А как же ты учишь то, сам не зная что? Этим надо было озаботиться до того, как приступать к обучению. Пиздец, это тяжелый случай конечно. Открой тогда гитхаб https://github.com/avelino/awesome-go изучай что другие люди создали до тебя. Не надо переизобретать никаких велосипедов, просто изучи существующие проекты и в следующий раз так не делай. Нахуя лезть в то, если ты сам не знаешь куда лезешь.
Это типо отдельное приложение/сервер которая как кубик лего вставляется в подходящий проект?
Можно ли на микросервисах зарабатывать? Например, написать что-нибудь и продавать его или в аренду сдавать (сервер поднять)?
Микросервисы - это когда ты берешь монолит и превращаешь в распределенный монолит. Теперь тебе надо в 10 раз больше людей, чтобы поддерживать твою систему. По этой причине микросервисы обожают на галерах, заказчик больше платит.
Как ты хочешь, сделать нельзя. Микросервисы уникальные для каждого проекта.
Ну так это проще поддерживать чем монолит по логике?
типо вот вася написал микросервис сам, знает все входы и выходы.
Намного сложнее.
Монолит можно просто открыть на компе, расставить брейкпоинты и посмотреть, как все работает. В микросервисах у тебя один сервис вызывает другой, тот третий, пятый, десятый, все их на компе не развернешь. В итоге получается ситуация, когда каждый сервис вроде работает, а все вместе не очень.
В монолите транзакциями управляет одна бд. В микросервисах у каждого сервиса своя бд. Сделать атомарные транзакции в таких условиях - это боль и страдания. Особенно, если сервисы пишут джуники.
На ютубе есть выступления на конференции хайлоад от авито, как они делали микросервисы, посмотри.
Расставить брейкпоинты и посмотреть что делается в монолите можно, только если у тебя монолит сам по себе самодостаточный и от других сервисов практически не зависит.
У нас на проекте монолит, но у него с сотню зависимостей от других сервисов, которые поддерживаются другими командами. Поэтому просто запустить тесты и подебажить получается далеко не всегда. Ну или писать огромное количество моков, заглушек, что начинает быть похожим на микросервисы, где точно так же хуй поймешь, заработает оно все вместе на тестинге или на проде или нет и приходится полагаться исключительно на описанные контракты между монолитом и сторонними сервисами.
>>107969
Проще раскидывать задачи на людей. Проще катать релизы. Если сервис, написанный славиком сычевым, внезапно падает в тестинге, то не нужно пересобирать весь релиз с нуля и катить - нужно просто дождаться, чтобы славик внес фикс и выкатил этот фикс в тестинг. Для каждого сервиса свой отдельный ci/cd должен быть. Вот в этом и преимущество. Если работал хоть раз с монолитами, то должен был сталкиваться с проблемой, что релизы становится сложно и долго катать. По сути это и решают микросервисы.
Таки да, порешал. С одной стороны - амазон и микрософт с миллионными бюджетами на рекламу. Проплаченые блогеры рассказывают, как легко и просто и очень недорого поднять микросервисы на aws или azure, любая макака справится. С другой стороны сотни галер топят за микросервисы, ведь чем больше команда, тем больше заказчик платит за разработку. К хайпу подключаются пиздоболы с ютуба и рассказывают одну и ту же методичку про масштабируемость. Про еблю с транзакциями и цену кластера кафки не рассказывают, контент должен быть позитивным. Джуники читаю блогеров, смотрят пиздоболов и думают, что микросервисы - это топчик, а монолиты - кринж для дедов. Такие дела.
А чем ты занимаешься на работе 399к??
опять не добавили эксепшены...
>Кто-нибудь может что такое микросервисы?
Микросервисы решают задачу менеджмента. Если у тебя в компании работают 100 программистов, проект быстро разрастётся до миллионов строк кода. Его придётся целую вечность тестировать, целую вечность компилировать и целую вечность деплоить. Вместо этого ты даёт этим 5 программистам вот этот сервис, тем 5 программистам тот сервис... Они могут независимо друг от друга работать, им не нужно общее совещание устраивать. Они могут договорится а-ля "мой сервис отправляет такие-то события".
>Это типо отдельное приложение/сервер которая как кубик лего вставляется в подходящий проект?
Да! Типа как кубик лего.
>Можно ли на микросервисах зарабатывать?
Нууу теоретически можно. Люди продают же API. Грубо говоря, тот же tinypng продаёт же компрессию за десять баксов/10,000 сжатых картинок.
>>107695
>Ну так это проще поддерживать чем монолит по логике?
Ага удачи тебе устроится в компанию где сотня программистов и 10 миллионов строк кода. Расскажешь как это проще поддерживать.
В исходниках той же винды миллионы строк. Тем не менее, им как-то удавалось все писать еще до начала шизы с микросервисами. Никто не выкатывал в прод по 10 раз в день. Потом все обезумели, начали раскладывать базу на 20 серверов и вызывать методы через tcp.
>Расставить брейкпоинты и посмотреть что делается в монолите можно, только если у тебя монолит сам по себе самодостаточный и от других сервисов практически не зависит.
>
>У нас на проекте монолит, но у него с сотню зависимостей от других сервисов, которые поддерживаются другими командами. Поэтому просто запустить тесты и подебажить получается далеко не всегда. Ну или писать огромное количество моков, заглушек, что начинает быть похожим на Монолиты, где точно так же хуй поймешь, заработает оно все вместе на тестинге или на проде или нет и приходится полагаться исключительно на описанные контракты между монолитом и сторонними сервисами.
Во первых, тебе почти никогда не надо будет тестировать функционал который затрагивает все внешние зависимости. Наиболее типичный случай, это когда тебе нужны 2-3 внешних зависимости. Тут можно или на моки полагаться, если функционал внешней системы простой - например ты туда отправляешь данные и все. Или переключить на тестовое окружение, если там более сложное взаимодействие.
Во вторых, чтобы все нормально протестировать - надо иметь qual среду где, уже поднять все реальные сервисы без моков ну кроме внешних систем у которых нет тестовых сред. И там гонять функциональные тесты.
where is English?
Переведи и сделай ПР
Любая хуйня в моей 2летней практике фиксилась либо оптимизацией запроса в БД, либо увелечением оперативки на хосте.
И тут мне Яндекс Практикум в бесплатном своем курсе предлагает байтоебить. Задачу то я решил, но я не понимаю, типа вы все тут байтоебите или что? Или эта задачка была специально для челов, которые с низкоуровневых языков решили вкатиться, что бы видели как подобное байтоебство реализовано в Го`шечке?
В яндексе все байтоебят, и себе растят таких же. Странно с двухлетнем опытом не быть в курсе о таких базовых вещах
Скорее просто чтобы ты посмотрел в стандартную библиотеку и попользовался unsafe и профилировщиком.
Ну судя по их слитому коду они не так жестко байтоебят.
Но вообще вопрос про другое был, вы парни, тоже байтоебите? или так же как и я - крудошлепите в основном?
Объясните по хардкору, почему столько людей вкатываются в го? Все такие фанаты микросервисов? Что, блять, интересного, может быть в пилении микросервисов?
Раньше крудошлепил, сейчас байтоеблю (Ява). Но очевидно всему надо меру знать и байтоебить только там где это оправдано.
Это бывшие дотнетчики. Дотнет сильно обмяк за последние годы, а работа та же самая, даже с дебильными if err != nil.
Не понимаю как можно байтоебить и двигать микросервисы, буквально одно другому противоречит. Выглядит будто ребята на всех стульях хайпа одновременно хотят усидеть.
Почему бы просто не писать на ООП? Вы серьезно просрете опыт и инфраструктуру ради очередного хайпа?
Нет, я же джавист
Не знаю как в джаве, но в дотнете фактические микросервисы строятся вокруг кучи говна из жоп индусов под названием Entity Framework. Буквально в каждом проекте воняет этой смесью кари и дриста. Нельзя просто взять данные из бд и вернуть джейсончик, надо нахуячить слои абстракции ради абстракции с конфигами ради конфигов. Ну и в целом дотнет считается дешевой хуйней для бедных, где криворукие мартышки из мумбая что-то там педалят, криво косо.
да
Это аналог Hibernate, да в джаве такое есть. Я про то, что посади тех же индусов на го, и они напилят тебе AbstractFactoryProxyDecorator сколько угодно.
Говнокодить можно на любом языке, от этого сам язык плохим не становится и он от этого не спасёт.
Забавно, я вот часто слышал мнение, что EF единственная годная Орм среди всех языков.
Это говорит об уровне долбоебов, которые так и не осилили left join. Задача орм отмапить сырые данные из базы на поля твоих структур, а не делать вид, что бд у нас как бы лежит вот тут рядом в памяти и как-то магически работает.
Думаю, что надо поднимать тест сервер и создавать новый инстанс с его клиентом и урлом, пикрил.
Всё правильно делаю? Есть методы получше?
Для го уже есть орм, только вот стандартом она почему-то не стала
Сервер имеет смысл поднимать не для юнитов а для e2e тестов когда ты полностью верифицируешь работу функциональности от получения вызова до ответа.
Чето я все равно не понимаю. Вот если у нас гига-стандартный геттер типа пикрил, что тут можно мокать? http.Client - это же стракт, а не интерфейс.
Ты текстиль метод Access так? Тебе нужно сделать новую структуру которая будет в себе содержать http.Server. Можешь поле оставить без названия, так будет даже удобнее. Для этой структуры ты пишешь интерфейс с методами копирующими оригинальные, потом ты пишешь в своей структуре реализацию этих копированных методов (просто прокидываешь данные дальше в реальный метод. Будет что-то типо func (s *MyServer) Do(req http.Request, ...) error { return s.Do(req...) }). И используешь в своих тестируемых методах только интерфейс, а реализацию подключаешь на этапе инициализации RemoteEndpoint. В нормальном коде ты подсовываешь нормальный сервер, а в тестах мок. Надеюсь доходчиво объяснил
О каком нормальном сервере идет речь, если речь идет о внешнем ресурсе? Нахуя обычному геттеру получать какой-то сервер?
Бля ну наебланил чутка, http.Client имелся ввиду, суть же понятна
Делай дамп всех горутин https://stackoverflow.com/questions/23354810/how-can-i-dump-all-a-go-processs-stacks-without-killing-it
И смотри какие долго не меняют точку исполнения. Только учти, что это дорого и не стоит делать на проде.
>>111428
Не будет. Просто горутина встанет на Wait и всё.
Благодарю. Мне именно на отладке надо.
Как это так. Переменная по умолчанию 0. Не приводит ли в дальнейшем к ошибкам, которые не заметили?
Создай *int тогда у тебя будет по умолчанию nil
так defer жи есть чтоб не проебывать
ну получше наверное чем в каком-нибудь си где если объявил и не проинициализировал то там может быть вообще что угодно
Чел, не одной вейтгруппой мир полон. Есть ещё хитровыебанные каналы, потенциально бесконечные залупы типа пока вар пук < вар срёньк, блокировки соединения и прочая хуета. В этом цирке с хуями нормальный стул порой по 3 дня ищешь.
тут согласен. но я хз, правда, ты там свой nginx что ли решил написать, что так заморочился...
зачастую можно асинхронное говно сделать синхронным, и не сильно потерять при этом в скорости выполнения.
таймауты ещё хорошо помогают, если у тебя куча непонятного асинхронного говна
Много запросов к разным БД, где нет зависимостей результатов друг от друга. Тут как бы синхронизация чувствительно бьёт по времени выполнения.
Ищу работу в UK на линкедыне. Но вакансий как будто вообще нет от слова совсем. Бувально 50-70 штук на всю Англию + Шотланлию + Северную Ирландию.
Очевидно, что на Go пишет Гугл, но туда найма сейчас как будто нет совсем. Слышал про Go в Амазоне, но и там найма нет. Но при этом в Гугл и Амазон могут взять с любым бекграундом, если секции пройдешь.
Я скорее про обычные продуктовые конторки и галеры, где сидят педалят индусы и пакистанцы, а из местных только лишь менеджеры. Вот там как будто Go вообще нет нигде. Сплошная Java, Python и Js.
Верно ли, что в забугорных конторах Go плохо распространен?
С C, C++ и C# похожая хуйня, поиск отрезает специальные символы и смешивает всё в кучу.
Да как бы не сильно больше в итоге.
Но это хуйня на самом деле. Visa sponsorship сейчас нигде не делают, так как на западном рынке переизбыток рабочей силы. Поэтому местных берут, а не привозят из-за бугра.
Тут либо самому пытаться устроиться куда-нибудь на Кипр, в ОАЭ в русскоязычную контору или стартап, если хочется эмигрировать.
Я на питухоне сейчас педалю легаси за лоупрайс. Ищу технологии или места/проекты куда можно свитчнуться.
Как популярная технология в РФ - это Go. Весь крупняк пишет на нем. Там, где раньше был пхп или жаба/питух, сейчас пытаются писать на Го. Но при этом на западе кроме гугла на Го почти никто не пишет, насколько я вижу. Но, справедливости ради, местный айти рынок в Европе это то еще унылое говно.
> Как популярная технология в РФ - это Go
Лол кек чебурек. В то время, как на жападе поутих хайп вокруг goвна, в рф он находится еще на стадии ретроградного самоподдува. воистину отставание в 5 лет
смари чо мне чвк гпт написала))0
Падение интереса к языку программирования Go на Западе может быть вызвано несколькими факторами:
1. Насыщение рынка: С развитием других языков программирования, таких как Python, JavaScript, Java и других, разработчики могут выбирать альтернативы в зависимости от конкретных задач и потребностей.
2. Тренды и моды: В мире программирования часто сменяются тренды, и то, что когда-то было популярно, может уступить место новым технологиям и языкам.
3. Недостаток новых функций и инноваций: Если язык программирования Go не предлагает инноваций или новых функций, его популярность может постепенно уменьшаться.
4. Конкуренция: Существует множество языков программирования, и конкуренция за разработчиков и проекты очень высока. Это может также повлиять на интерес к Go.
Несмотря на уменьшение хайпа в некоторых странах, Go остается все еще популярным языком программирования во многих областях, таких как облачные вычисления, микросервисная архитектура и распределенные системы.
Я вообще не понимаю чем фишка Го.
Вот например джаву хаят за то что она невыразительная, но потом видишь что Го - это такая же Джава без ООП, но это уже "особый подход", когда вместо добавления фишек в язык ты просто пишешь больше кода и это круто и ново.
Называют новым Си, но почему-то со сборщиком мусора, так же как в джаве, но если в джаве это тормознуто, то в Го - это новый Си, круто, быстро, молодежно.
Что компилируется в бинарник - круто, так джава это тоже может делать, но если в джаве Грааль особо никому не нужен по заявлениям, то тут это прямо крутая ключевая фишка.
Как так?
Даже с учетом GC, в Go сильно меньше оверхеда, чем в жабе.
Грааль в джаве никому не нужен потому что там нет нормальной поддержки рефлексии. В Го при этом рефлексия есть, как и полноценная компиляция в бинарь. Ну то есть компиляция в бинарник по-прежнему нужна, только в джаве ее полноценно не смогли осилить.
>Даже с учетом GC, в Go сильно меньше оверхеда, чем в жабе.
Почему?
>Грааль в джаве никому не нужен потому что там нет нормальной поддержки рефлексии.
Большинство проектов так-то обходится без рефлексии. И часто вы используете рефлексию в ГО на проде? Это и есть причина все переписывать?
Зачем все делать умно, быстро и чисто, когда можно все делать. тупо, быстро, грязно и через рефлексии?
>Почему
Большой оверхед на хранение объектов в памяти. Условный List<Integer> весит в разы больше, чем обычный []int в Go с тем же количеством элементов. Так просто исторически сложилось в JVM. В Go оверхед конечно же тоже есть, но заметно меньше.
>>115568
>Большинство проектов так-то обходится без рефлексии. И часто вы используете рефлексию в ГО на проде?
Руками рефлексию применяем редко. Но вот в библиотеках ее достаточно. У нас как минимум либа для валидации на рефлексии целиком работает.
В жабе при этом почти любая крупная либа работает на рефлексии в том или ином виде. Тот же спринг - это рефлексия во всех щелях. Они уже который год пытаются Spring Native выкатить в prod-ready состояние?
>>115568
>Это и есть причина все переписывать
Там, где сейчас работаю, вся кодовая база уже на Go написана. В прошлом месте работы новые сервисы писали на Go, старье на джаве либо переписывали на Go, если там совсем уж кал мамонта был, либо делали свитч на Котлин в некоторых сервисах.
>Условный List<Integer> весит в разы больше, чем обычный []int в Go
Там а почему ты сравниваешь List<Integer> с []int, а не int[] c []int?
Потому что говорил именно про объекты, а не про примитивы.
Примитивы в JVM кажется практически нигде не используют.
Но ведь логичнее сравнивать яблоки с яблоками? А не динамические вектора, которых по-моему в ГО вообще нет, с массивами.
Динамические вектора это и есть слайсы в Go.
Но речь вообще шла об оверхеде на хранение один объект в JVM, вне зависимости, массив/слайс это или нет.
> ))0
Дело не в том что мне по какой-то причине припекло (я джавист вообще), дело в манере письма уебищной, хотелось бы меньше видеть таких
> мне припекло
что делать знаеш
> Дело не в том
та мы поняли
> я джавист вообще
а нам зачем это знать
> хотелось бы меньше видеть таких
мало ли что тебе там хотелось сидя на аиб, ты бы еще в /d/ петицию создал
>Динамические вектора это и есть слайсы в Go.
Собственно не в том же смысле что и в других языках. Насколько я понял это в том смысле что их длина неизвестна на компиляции. Но расти они не могут, нужно вручную аллоцировать больший массив и копировать туда старый через append.
То есть это аналог джавовского Arrays.copyOf(originalArray, newSize). То есть вот это удобно?
int[] arr = {1,2,3,4,5};
int[] arr2 = Arrays.copyOf(arr, 10);
arr2[9] = 10;
Мне кажется если бы джава так заставляла писать - визг бы стоял раз в 5 круче чем сейчас. А в Го это свежо, компактно и экономично?
>>115478
>Грааль в джаве никому не нужен потому что там нет нормальной поддержки рефлексии.
https://www.graalvm.org/latest/reference-manual/native-image/dynamic-features/Reflection/
А что именно ненормальная поддержка?
>Native Image fully supports reflection in ahead-of-time compiled images.
>нужно вручную аллоцировать больший массив и копировать туда старый через append
Не нужно.
append сам аллоцирует память большего размера и сам копирует. В любом случае добавление нового элемента в конец у тебя будет выглядеть как arr = append(arr, element).
>Не нужно.
>append сам аллоцирует память большего размера и сам копирует. В любом случае добавление нового элемента в конец у тебя будет выглядеть как arr = append(arr, element).
Жопой читаешь? Он же именно про это и говорит:
>аналог джавовского Arrays.copyOf(originalArray, newSize)
В целом я с ним согласен. В нормальном языке у тебя достаточно средств, чтобы можно было реализовать коллекции на самом языке. Все коллекции в джаве, шарпе, С++ реализованы на самом язке, никакой магии рантайма. Зато пайтоны и жопаскрипты коллекции реализуют нативным кодом.
Джавовский copyOf всегда копирует.
В то же время append в гохе умеет делать in-place добавление в конец массива, если есть свободное место. К тому же заметь, что copyOf в джаве именно копирует с расширением количества элементов, а не просто добавляет в конец массива элемент.
>>116675
>В нормальном языке у тебя достаточно средств, чтобы можно было реализовать коллекции на самом языке. Все коллекции в джаве, шарпе, С++ реализованы на самом язке, никакой магии рантайма
Ну, если принять тот факт, что сами массивы реализованы рантаймом той же JVM, то да, коллекции вроде ArrayList и LinkedList поверх них строить довольно просто в стандартной библиотеке.
>Жопой читаешь? Он же именно про это и говорит:
в слайсах есть такое понятие как capacity, и если в твоем слайсе еще достаточно памяти для аппенда нового элемента, он не будет аллоцировать память. Вы бы хоть базу почитали прежде чем толкать свое мнение.
Откатись в старт спора, суть в том что динамический массив в го имеет существенно меньше оверхеда чем в джаве
Нет, если имплементировать как в го - то и оверхед будет как в го. Просто это неудобно, поэтому так никто и не делает. То есть весь выигрыш в оверхэде не в языке, а в желании программиста писать более низкоуровневый код
>Джавовский copyOf всегда копирует.
>В то же время append в гохе умеет делать in-place добавление в конец массива, если есть свободное место. К тому же заметь, что copyOf в джаве именно копирует с расширением количества элементов, а не просто добавляет в конец массива элемент.
Ну такое на джаве точно реализовать нельзя.
>>116718
>Ну, если принять тот факт, что сами массивы реализованы рантаймом той же JVM, то да, коллекции вроде ArrayList и LinkedList поверх них строить довольно просто в стандартной библиотеке.
Массив и переменная это, два самых базовых примитива. Они в любом языке поддерживаются рантаймом/компилятором.
>в слайсах есть такое понятие как capacity, и если в твоем слайсе еще достаточно памяти для аппенда нового элемента, он не будет аллоцировать память. Вы бы хоть базу почитали прежде чем толкать свое мнение.
Ох блядь, вот нерешаемая задача то! Создать класс в котором будет массив и текущая заполненность. Это прям уникальная особенность го, нигде такого больше нету.
чувак загугли про ArrayList, ахуеешь, что не только в Го такое есть
ты бы хоть на ютубе что-нибудь про структуры данных посмотрел, прежде чем в тред высираться
Ты первый начал высираться по поводу того, что слайсы это не аналог ArrayList из джавы, хотя на самом деле это так и есть.
Слайсы не аналог ArrayList в плане синтаксиса.
ArrayList это просто класс ничем не отличающийся от других классов, который работает точно так же как и все стандартные классы. Можно написать свою реализацию List и использовать её вместо стандартного ArrayList в любом коде.
Слайс это примитив встроенный в язык, которые имеет специальные конструкции языка которые могут работать только с ним. И если повторить функционал слайса, еще можно, то вот синтаксис работы с ним повторить нельзя. И использовать свой продукт слайсосодержащий, вместо слайс натуральный без консервантов и синтаксического сахара - нельзя.
>Верно ли, что в забугорных конторах Go плохо распространен?
Менее распространен чем Java, но в целом вакансии есть и даже побольше платят чем в среднем на Java. Но работу дольше искать и много криптостартапов.
Не всем нравится делать абстрактные фичи и постоянно держать пару мест куда можно свались когда стартап посыпется.
То что они живут за счёт денег инвесторов, деньги кончатся все пойдут на мороз. Ну и частенько бонусы норовят токенами выплачивать.
Потому что они живут год-полтора-два максимум.
>>117900
Нормального не завезли, но может хватит https://github.com/fyne-io/fyne
Альтернативы:
https://github.com/avelino/awesome-go?tab=readme-ov-file#gui
На Go принято делать CLI вместо гуя.
Если нужен гуй, то лучше рассмотреть кресты+qt, либо js+electron.
Что самое интересное, сама библиотека уже несколько лет заброшена, как и все проекты в этом списке, за исключением одного.
Так ты же на нем и хотел писать
Тогда джава + свинг
То это пидор, которого нужно унижать.
К примеру, на обычном Си хеллоуворлд без всяких ухищрений занимает 16Кбайт. Энтузиасты добивались и меньших размеров вплоть до сотни байт.
Тебя же уже обоссывали, или прямо в этом треде или в прошлом. Нахуй ты опять свое говно принёс
Я другой анон, только зашёл в тред
В реальных задачах 99% всех оптимизаций делаются через добавление нужного индекса в бд, а сам микросервис можно написать хоть на джаваскрипте.
>О каком перфомансе может идти речь вообще?
Об обычном, перформанс не зависит от размера бинарника
>на обычном Си хеллоуворлд без всяких ухищрений занимает 16Кбайт
>без всяких ухищрений
Жырнота, то какая!
> бинари на го весят по 10Мбайт
И чё? В чем проблема то? Места на диске жалко? Не под микроконтроллеры пишем же.
По сути вот содержимое стрипнутого сишного helloworld.
Говна масса, но при этом весит 17000 байт.
Часть говна можно безболезненно вырезать.
Полюбому это несравнимо с тем, что генерировал golang, когда последний раз его смотрел.
При этом гошный исполняемый файл был непереносим между разными дистрибутивами, как ожидалось.
Тогда зачем это всё?
https://github.com/rivo/tview
Вот более живое.
Это все шутка, я не предлагаю всерьез такое писать. Если конечно ты не пишешь системную утилиту которая должна через ssh работать.
Никто в своём уме не будет на c писать сервер для перекладывания протобуфов в json-ы. На го рантайм за тебя уже делает кучу всего, н за это ты платишь местом и накладными разходами на работу рантайма.
Для начала полинкуй с musl или убери glibc из линковки.
Если взялся размеры мерять, то добейся статических бинарей и там и там.
Просто хочу разобраться.
>Для начала полинкуй с musl или убери glibc из линковки.
>Если взялся размеры мерять, то добейся статических бинарей и там и там.
Ради Hello world?
При необходимости я рантайм весь выкину, положу в регистры что надо и дёрну системный вызов ядра write на дескриптор 1 (который есть небуферизированный stdout). У будет hello world размером с меньше килобайта. Там даже линковать ни с чем не придётся.
Но при этом динамически слинкованный файл на сях запустится на большем числе разных линуксов, чем статически слинкованный исполняемый файл на Go.
Спасибо
Если бы Скрудж Макдак не судился со всеми за жаву, то может и была жава вместо голенга.
>static class Struct
Бля просто в голос как это жалко выглядит... Особенно если знать об отсутствии value типов которые архитекторы джавы 10 лет пытаются стащить из сишарпа.
Просто не выходи за пределы java треда, пожалуйста. Ты не компетентен обсуждать современное программирование.
Опыт - сын ошибок трудных.
Конкретный пример - моя софтина на плюсах. Исполняемый файл запускается на всех современных линуксах, до которых смог дотянуться. Весит около 200 кб, дёргает половину POSIX, в т.ч. pthread.
Собранная на Alt Linux программа на Go на Debian ругается на Kernel API (код ошибку сейчас не назову, но если доебёшь, то ночью выложу сюда).
>Собранная на Alt Linux программа на Go на Debian ругается на Kernel API
Play stupid games, win stupid prizes. Разворачиваю все сервисы, написанные на го в scratch-контейнерах (вообще без userspace библиотек).
Так что проблема в тебе.
Кто будет писать CLI-утилиты таких размеров? Когда можно написать в разы более компактные на С.
У меня старый ноут, где всё тормозит из-за того, что современные программисты забивают на оптимизиацию своих программ.
Кому интересны твои детские проблемы?
>При необходимости я рантайм весь выкину, положу в регистры что надо и дёрну системный вызов ядра write на дескриптор 1 (который есть небуферизированный stdout). У будет hello world размером с меньше килобайта. Там даже линковать ни с чем не придётся.
Так об этом и речь! Что сделать настоящий маленький бинарник можно, но точно не
>без всяких ухищрений занимает 16Кбайт
А с динамической линковкой можно потеряться с питоном, там вообще десяток байт будет. А то что там интерпретатор на мегабайты это другое.
Вот именно поэтому мы и уволили всех жава-скуфидонов из конторы, а их помойные говноприложения на спринг буте и хубирнейте просто выкинули и все написали с чистого листа на гоулэнге
Я тебе ещё раз повторяю, кого ебут 100 лишних мегабайт занимаемых на диске утилитой?
>>120004
Гошные проги даже тормозят? Сдаётся мне, что ты пиздишь. Тормозить могут как раз монстры на плюсах и джаве. А докер например везде летает. Я на ноуте с процом интел 5200у 2/4 и 16гб рамы даже работать могу. Диск, естественно, ссд. Может у тебя там хард до сих пор и поэтому все тормозит? б
Почему уволили? Ну они скуфидоны закостенелые. Им предложили свичнутся в гоулэнг, они попердели два месяца, но высирали максимально ублюдочный код и писали на гоулэнге как на жаве. Ни один пулл реквест мы не приняли и они все написал по собственному желанию. Да и что-то стоящее все равно не написать без спринга и хубирнейта. Правда нам не нужны такие сервисы, которые стартуют по минуте и потом в рантайме что-нибудь отстреливает. Поэтому скуфы пошли на мороз
>Да и что-то стоящее все равно не написать без спринга и хубирнейта.
Ну вот же, я привел пример что можно писать на джаве как на Го, и скорость старта будет сравнимая, потому что меньше кода грузить. И как ты и скзаал - ничего не мешает писать на Го как на джаве, т.е. язык тут не причем. Так чего просто не стали писать по-другому на джаве?
Кул стори бро! Сам придумал или чат гпт попросил?
>16гб рамы даже
>даже
Теперь понятно, почему все пофиг на жирные бинарники. Ведь люди даже на 16гб могут работать... Слов нет просто. А дальше что? 128 гб должно хватить, чтобы запустить консоль? А окошко отрисовать пару терабайт?
Как раз джава это один из немногих примеров когда проприетарная технология, смогла стать открытой и driven by community. Для примера можешь загуглить какая сейчас самая популярная сборка JDK
Странно, а еще говорили что Го экономичный по сравнению с явой
>Ну вот же, я привел пример что можно писать на джаве как на Го
Нет, нельзя. Посмотри реальные проекты на жабе и гоулэнге. То, что ты написал - это говно, которое никто не будет поддерживать.
Я так в универе писал на джаве и получал пятёрки. Тогда это был глоток свежего воздуха по сравнению с С++.
>То, что ты написал - это говно, которое никто не будет поддерживать.
Так это буквально Го код. Кто-то же поддерживает проекты на Го?
Забыл добавить, что тогда у меня всё работало на компе целерон 850МГц (пень 3 по сути) и 128Мбайт ОЗУ. Тогда даже джава не жрала память гигами, а функционал был тот же. Что изменилось за эти годы - не понятно. Почему ровно такие же программы стали жрать в десятки раз больше ОЗУ?
Так тормозит или диск забит консольными утилитами (причем написанными на го), ты определись
Сейчас ты говорил про размеры бинарников.
Бинарники загружается в ОЗУ и ещё сильнее разрастаются за счёт выделения памяти в ходе выполнения. А если ОЗУ не хватает, то начинается свопинг на жесткий диск, а это очень сильная просадка по производительности. Да и сами диски тоже не резиновые.
Есть какие-нибудь дешевые курсы, где на проекте обучат? То есть чтобы был готовый проект по прохождению курса?
На дешевых курсах ничему не обучат, да и материал там дают шлаковый. Я меньше 100к курсы даже не рассматриваю.
Ну а в чем разница, приложухи на Qt все равно будут запускаться.
Один хуй Qt - это стандарт в мире десктоп разработки, на gtk уже никто не пишет
Я вот не понимаю, что они там пишут на этом го? Консольные приложения получаются с жирными бинарями, выгодней на си написать, десктоп не пишут на го, проще С++ и Qt написать, веб проще на пхп писать, там и фреймворки есть под это, а на го ничего нет.
>опенсорсная
Oracle судился c Google за то что повторили API жавы в далвике. С точки зрения оракла апи - интеллектуальная собственность, даром что исходники открыты.
Дешёвые курсы частенько на складчине покупают. Можешь скачать оттуда парочку и посмотреть какую там парашу преподают.
Лучше уж взять кредит на крутой курс и пройти его. Тем более, что с зп программиста на го, ты его быстро погасишь. Так что это выгодная инвестиция.
Бля.. какой же ты даун ебаный
>Я вот не понимаю, что они там пишут на этом го?
Всякие вебсервисы. Гошечка достаточно неплохо масштабируется.
Тогда выгодней на джаве написать, наработок у джавы куда больше и пул инженеров куда больше
Никто кроме реального интервью тебе не скажет насколько тебе пиздец. Попробуй, походи по интервью, посмотри что спрашивают.
Но я бы сказал что полный пиздец, потому что хрюши отметают по опыту на конкретной технологии.
И как тебя выгоняют при закрытии проекта, а не компании?
Как же ты заебал, поехавший
А сколько опыта надо вообще, чтобы претендовать хотя бы на 200к? Это и так серьёзная потеря, для понимания.
Да мне никто ничего не может сказать вменяемого по поводу смены проекта внутри. Поэтому рассчитывать надо, что выгодят на мороз. Не выгонят - и хорошо, но мало ли.
Ух сейчас напишем cli тулу на джаве чтобы тащить с собой jre, ух ахуенно
>>120004
Используй на своем старом ноуте старые программы и кайфуй от жизни, в чем проблема?
>>120386
Немного жалко что гтк как технология говнище лютое на фоне кют, потому что амбассадор гтк гном лично для меня намного лучше всратых кед
>>120692
Многопоточность отличная, легче и приятнее наверно в мейнстримовых языках нет
>А сколько опыта надо вообще, чтобы претендовать хотя бы на 200к? Это и так серьёзная потеря, для понимания.
Ну стандартно от 3х лет наверное
>Грин треды в джаве есть
Твои грин треды обосрались, когда начались утечки памяти и прочие приколы. Бесшовного перехода не вышло. Пройдет еще лет 10 пока их допилят до нормального состояния. Ну и API у них мерзотный и многословный
>Лучше уж взять кредит на крутой курс и пройти его. Тем более, что с зп программиста на го, ты его быстро погасишь. Так что это выгодная инвестиция.
И что же это за крутой курс по го? Скиллбокс?
А какие именно алгоритмы ты хочешь учить?
Так-то я бы сказал просто придумывать задачи на эти алгоритмы и решать их
те которые на собеседованиях спрашивают. Ну там задачки на очереди, на стек, на списки, динамическое программирование, деревья, графы. А придумывать их - ну это вообще шиза, у меня во-первых воображения 0, во-вторых чтобы что-то придумать нужно это понимать
Вопрос в количестве усилий которые надо приложить. Так то и Си хорошо масштабируюется nginx пример. Но чтобы этого добиться, надо очень сильно постараться. А где-то всё работает из коробки.
>Твои грин треды обосрались, когда начались утечки памяти и прочие приколы.
Сто раз говорили не юзайте тредлокалы, но проблема у гринтредов конечно.
>но проблема у гринтредов конечно.
Проблема у дизайнеров этого кала, потому что не могут реализовать обещанного, не сломав злоебучий существующий легаси.
Давно пора уже
Один хуй на современных джк большинство старого кода не запуститься из-за отсутствия --illegal-access=permit в современных версиях рантайма.
>
>Давно пора уже
... было внести изменения в язык, ломающие обратную совместимость, как это в мажорных версиях других языков регулярно происходит.
Это копия, сохраненная 10 июля в 07:27.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.