Go или Golang — компилируемый язык программирования от создателей таких шедевров, как UTF–8, язык С, UNIX, Plan9 и других. Go поддерживает типобезопасность, имеет богатую и универсальную стандартную библиотеку и инновационные семантики одновременности: все то, что мы в индустрии называем concurrency и parallelism. На сегодня язык Go является маяком стабильности, прагматичности, де-факто представляет из себя стандарт в мире бэкенд–микросервисов и серверного оркестрирования.
>>2740844 Очень скоро(2 с половиной человека обсуждали в 2018 году). На самом деле в го все хорошо сейчас, и надо просто поправить несколько багов языка и все
>>2740844 А зачем ему вторая глобальная версия? Язык уже хорош. Проблемы есть, они решаются. Дженерики завезли, хоть они и не были обязательными. Главное, чтоб всё говно подряд в него не пихали и язык не потонул
>>2741244 >>2741882 >>2741897 Ага, не будет. Поэтому вторую версию активно пилят на гитхабе. Алсо, у тебя специфический архитектурный паттерн постов без точек в конце, так что не притворяйся глыбой общественного мнения.
>>2742026 Очередной шиз не в силах отличить разных анонов. Алсо, укажи этот активный пилящийся на гитхабе проект))) А ты по ссылке выше всего пару ишуев за весь 2023 год
>>2742043 Это не один из, а буквально человек, который внес основной вклад в язык. Ишуи на твоем гитхабе не более чем рандомный высер других рандомных людей, их создавать если что каждый может, не нужно быть контрибутором
>>2742045 А остальные четверо основателей там кофе твоему Коксу таскали? С момента публикации кода не кислое сообщество появилось. Ты можешь дрочить на своего лектора сколько угодно, но гошка уже далеко не внутренний проект гуголя.
Какая примерно разница в затратах на сервера node.js VS go? Понятно, что нода жрет куда больше, но вот если, условно говоря, на ноде нужен один сервер с четырьмя ядрами и 8гб оперативы, то во сколько раз меньше ресурсов нужно будет go? При допущении что функционал и нагрузка +/- одинаковые.
>>2742077 В JS треде выкладывали сравнение. При самых синтетических условиях Go не более +10% выдаёт. Гигантам такое интересно, а остальные прост повторяют за ними.
>>2742474 Ржавый тоже умеет, вот только на нём до сих пор пишут лгбт маргиналы. Голанг хорош для микросервисов и жонглирования ими, но рыночек решает в пользу ноды. Отсюда вытекает запихивание её в те направления, где жопоскрип ранее не использовали.
>>2742474 На самом деле нода быстрее для прототипирования и MVP, если это не хайлоад, то и на первых этапах жизни стартапа нода лучше т.к. на ней дешевле и быстрее разрабатывать из-за большого количества специалистов. Самое хреновое это взять, например, rust и тогда стартап загнется с вероятностью 90%
slow.Value - это аналог atomic.Value, с двумя ограничениями:
Вызов Load() всегда занимает не меньше 1ms Нельзя делать больше одного вызова Load() в один момент времени. Реализуйте Batcher, который оборачивает slow.Value и ускоряет чтения за счёт батчинга.
Например, если 1000 горутин одновременно сделают вызов (Batcher).Load(), то можно прочитать значение один раз и раздать всем ожидающим горутинам. Это будет в 1000 раз быстрее, чем вызвать (*slow.Value).Load() напрямую в каждой горутине.
Ваша реализация не должна создавать stale read. То есть, Load() всегда должен возвращать значение не старее последнего Store() на момент начала вызова Load().
>>2743169 >Ваша реализация не должна создавать stale read. То есть, Load() всегда должен возвращать значение не старее последнего Store() на момент начала вызова Load(). ну тут очевидно что снаружи это можно обернуть в rwmutex. требования к тому, сколько может ждать Store не описаны. внутри мютекса просто https://pkg.go.dev/golang.org/x/sync/singleflight или самописная альтернатива.
>>2743169 >Ваша реализация не должна создавать stale read. То есть, Load() всегда должен возвращать значение не старее последнего Store() на момент начала вызова Load(). ну вот такое тесты проходит например https://go.dev/play/p/idgiLgEFM7d >не старее последнего Store() вызова или выхода?
Расскажи про свои проекты, анон. Какой стек, типовые или интересные задачи. Читаю требования к гошникам, поголовно нужен redis, kafka, rabbitMQ? Насколько глубоко нужно разбираться во всем этом?
>>2743739 ну это от компании зависит. у нас например отдельная команда занимается инфрой, а команды которые пилят фичи для юзеров тупо используют обёртки от инфры - в идеале у нас тупо обертки, которые предоставляют "кеш" и "очередь". подключать/менеджить/пилить фичи для их не приходится, но на нас задача их правильно архитектурно заюзать, чтобы было масштабируемо, и тут детали (например нагрузка/макс размер сообщения/доступность) тоже учитывать приходится. >rabbitMQ это по-моему какая-то устаревшая дохлая никому не нужная залупа, хотя и у всех на слуху. если она в вакухе, то 100% тебе нужно будет поддерживать легаси >redis ну тут реально учить нехуй, просто открываешь доку с командами и ебашишь. разворачиваешь в докере и через терминал можешь все команды сам отдебажить. ну разве что если приходится делать не тупа кеш и ты луа не знаешь, то надо луа выучить. учитывая что для редиса тебе максимум литералли базовый синтаксис пригодится с несколькими функциями стдлибы, то это даже легче гошки. >kafka ну типа паблишим читаем, хз. у нас вся работа завернута в свою обёртку. буквально сделать queue.New() и зарегать хендлеры вроде queue.HandleZalupa(zalupaHandler). ну например надо понимать что накать, а что откладывать. и что можно класть в сообщение, а что не стоит (а тут уже надо понимать отличие кафки от натса или другой хуйни).
>>2743787 >это по-моему какая-то устаревшая дохлая никому не нужная залупа, хотя и у всех на слуху. если она в вакухе, то 100% тебе нужно будет поддерживать легаси Лол, эксперт в треде. Кролик по сути та же самая хуйня что и кафка с некоторыми отличиями. Та же очередь, точно также используется в продакшене для микросервисов и новые версии регулярно выходят, как раз недавно вышла новая версия erlang и кролик обновили под него, хз откуда ты про легаси взял. Может у вас в конторе раньше был, но по каким-то причинам например слишком много данных весело в очереди и много писалось на диск перешли на кафку, а старое осталось на кролике.
>>2743916 да я хз я с ним не работал, но отец знакомого один раз пришел с работы и сказал что нужно переходить на другую очередь, ничего не объяснил, было какое-то совещание. энивей на собесе не должны развернуть, если знаеш как хотя бы какой-то очередью пользоваться
Начал пробовать. Подскажите, плз. Есть ли у меня возможность слать сообщения разных типов в канал. Может можно объеденить их как-то? Дженерики нам в этом не помогут? Допустим клиент мне шлёт разные сообщения по tcp, я их обрабатываю и хочу полылать в канал, который читается корутиной, которая уже реализует логику их обработки. Эти сообщения содержат разные данные и, соответственно, представлены разными структурами. Без алгебраических типов данных я иду нахуй с такими идеями?
>>2746540 Дженерики больше про устранение бойлерплейта. Я бы объявил интерфейс I с методом обработчиком, реализовал бы его для каждой структуры и канал объявил с типом элементов I. Ну это если логика для обработки сообщений разная. Правда придется перед тем как положить в канал определиться в какую структуру писать байтики или что у тебя там передается по tcp. Если не прав, то обоссыте. мимо-нюфаня
>>2744179 >не используя пакет sync? Разумеется используя пакет atomic!
В целом задача хреново сформулирована. Например для реализации многопоточных счетчиков часто применяют шаблон, когда у каждого потока свой счетчик, а когда нужно узнать общую сумму их тупо суммируют. есть проблема, что часть данных не актуальная на момент подсчета Можно данные в канал слать, как уже подсказали. Можно свой мьютекс на базе атомарного чтения делать но это опять же sync.
В целом за использование чего-то кроме XADD в прод коде, надо пиздить.
>>2746701 Покормлю. Можно горутины и каналы. Нельзя sync и sync/atomic. Анон выше дал правильный ответ. Встречал реализацию, когда присылают не число, а функцию (команду) инкремента.
Привет. После долгого программирования на Питоне вернулся к Го. Когда открыл папку с гошными проектами сразу появились такие ошибки. При этом сами файлы запускаются отлично (без ошибок). Что это, и как это фиксить?
>>2748548 ну это охуенно зависит от задачи. сишку не обыграть, компайлер тут довольно тупой, чтобы скорость конпеляции была быстрой. плюс ГЦ. но зависит конечно же от программы. если ты конкретную асинхронную программу напишешь тупа на тредах, если в сишке ты не ебёшь как делать грин треды и оптимизировать под асинхронность, то сишка соснёт под нагрузкой по сравнению с гошкой. усреднённо получше шарпа и тем более петона, за исключением корнер кейсов.
>>2749413 >усреднённо получше шарпа и тем более петона, за исключением корнер кейсов. А еще за исключением более-менее сложной бизнес-логики. Джсоны перекладывать конечно удобно, но строить модели данных с логикой их взаимодействия с только с помощью примитывных структур это величайшая ебля которую можно придумать.
>>2749413 >если в сишке ты не ебёшь как делать грин треды В Си грин треды только долбоебы делают. На сях запускают N нативных тредов и шарят работу между ними. Почитай про тот же Nginx работает с потоками https://habr.com/ru/articles/260065/
Горутины позволяют писать код с большим удобством, но жертвуют производительностью по сравнению с хардкор подходом.
>>2749616 >но строить модели данных с логикой их взаимодействия с только с помощью примитывных структур это величайшая ебля которую можно придумать. И к сожалению гугл это делает.
>>2749880 >Почитай про тот же Nginx работает с потоками ну он заточен бейзикалли под одну задачу, это не новые продуктовые фичи в каждом спринте допиливать. в зделол-годами оптимизируеш-годами пользуешься конечно сишка выиграет. >запускают N нативных тредов и шарят работу между ними в такой формулировке звучит так же, как гошка. если опустить блевотные шахматные альтернативы, то статья тупа про тот же нетполлер в го, только там это главная фича.
>>2749957 >Структуры с методами не покрывают потребность? Покрывает, но кода дохера получается, повторное использование кода низкое, а дублирования много. Может конечно это у нашего проекта такие проблемы.
>>2749616 Структур и функций достаточно чтобы строить сколько угодно сложную хуйню. Функциональный язык, например OCaml, не даст спиздеть. Просто помимо этого язык имеет вменяемую систему типов, нормальный полиморфизм, а не то говно позорное, что завезли в го, алгебраические типы и умный компилятор, созданый учёными.
>>2751800 Просто интересно, откуда у залетных в тред такие познания в других языках и при этом опыт применения Го? Ты на OCalm пишешь продакшен код? Или тут 95% студентота, которая приходит с языком на котором лабу1 написала
Анон, посоветуй, как го-вейно обыграть следующую архитектуру: приложение периодически шлет GET запросы к одному хосту по нескольким урлам, запросами получаются данные и дальше они передаются обработчику, который парсит данные и должен инициировать POST запрос к тому же хосту. Хочу сделать асинхронное получение и отправку, т.е. развязать операции с GET и POST. При этом у серверного хоста есть рейтлимит, который известен клиенту. Думал сделать простую очередь на одном канале, куда worker-ы для каждого урла будут кидать запросы, а обработчик очереди (канала) будет отсылать их серверу и при этом контролировать, что рейт лимит не превышен. Если превышен, то временно приостановать обработку очереди. Самое простое решение это отдать канал очереди воркерам, которые инициируют GET и POST звапросы, но кажется это не лучшее решение, т.к. каналом владеет одна горутина, а пишут в нее другие. Но в целом закрывать этот канал необходимости нет. Норм подход? Какой вариант еще может быть? FanIn, FanOut в чистом виде не придумал как сюда прикрутить.
>>2754108 >Хочу сделать асинхронное получение и отправку, т.е. развязать операции с GET и POST. зачем и нахуя? звучит как переусложнение на ровном месте. плюс твоя очередь на канале проебется при любом рестарте
>>2754125 >зачем и нахуя? звучит как переусложнение на ровном месте. Для pet проджекта, хотелось бы реализовать очередь на каналах, чтобы все асинхронно работало. Представим, что сервер готов держать 1000 запросов в минуту от одного клиента, а обработка полученных данных на стороне клиента условно может занимать 5 сек. За это время можно отправить еще несколько GET -запросов + какие-то обрбаотчики могут завершить выполнения и быть готовыми отправить POST. Они могли бы и сами это делать, но нужно тогда как-то шарить значение рейт лимита между воркерами. >плюс твоя очередь на канале проебется при любом рестарте это не критично совсем
>>2754138 >но нужно тогда как-то шарить значение рейт лимита между воркерами ну можно https://pkg.go.dev/golang.org/x/time/rate заюзать. ну т.е. с 5 секундами на ответ, тебе в любом случае придется дохуя горутин делать, чтобы все 1000 rps заюзать. ну ты там упорешься и будет один/N воркеров который делает геты, один/N воркеров для постов и дохуя горутин с вычислениями. и ты можешь еще разные N каждых воркеров поставить, бенчить это, и всё это будет обмазано каналами/вейтгруппами. или можно сделать так https://go.dev/play/p/O-7MgQV6Iqy и у тебя логика будет тупой и последовательной, с тем же самым количеством горутин
>>2752588 >Просто интересно, откуда у залетных в тред такие познания в других языках и при этом опыт применения Го? Ты на OCalm пишешь продакшен код? Или тут 95% студентота, которая приходит с языком на котором лабу1 написала Писал на нем диплом, реализовывал компилятор функционального языка с системой типов Хиндли - Милнера. А потом свернул не туда. Есть коллега которого из Гугла переманили HFT кодить на OCalm.
В пространстве функции main() находится slice с определённой ссылкой на область памяти. При использовании slice в func_slice создаётся копия x с другим адресом в раме. Какого хуя при внесении изменений в копию x, изменяется ещё и slice, который находится в другом пространстве и с другой ссылкой на область памяти?
Как я понимаю, что нужно добавить какой-нибудль шаг +1. Но как это сделать хз.
Пробовал еще сделать что-то -типа (s[2-1:len(s)/2+1]) но это плохое решение, что как работает с ограниченным количеством символов, если например будет нечетное слово не из 5-ти, а из 7 символов, то выведет три символа, а не два
>>2755557 >если нечетное- два символа два символа откуда? если примерно посередине, то смотри. для четного берешь индкесы [l/2-1] и [l/2] для нечетного - [l/2] и [l/2+1] например (или вообще то же самое, что для четных). остальное это научиться в синтаксис сабслайсинга.
да мне что-то кажется, что задача была не с подъебом про нечётное количество символов, а условие что нужно вывести два как раз к тому, чтобы у чётных/нечётных было одно решение.
>>2755515 >>2755614 Разобрался. При передаче в функцию создаётся копия слайса, но внутренняя ссылка на массив остаётся прежней. Можно узнать через принтование адреса первого элемента.
>>2740805 (OP) Взялся короче написать что-нибудь для практики и портфолио. У меня давно витала идея приложухи для небольшого бизнеса, где я когда-то работал. Ментор посоветовал насчёт проектов >Можно написать сервис, с crud ручками и БД, редисом и кафкой, чтобы потрогать библиотеки и т.д. Ну я и начал, там буквально десяток табличек: клиенты, заказы, мастера, услуги, номенклатура ремонтируемых агрегатов, самая такая база. И это чисто апи с ручками, т.е. чтобы это реально работало (а я хочу, чтобы это реально работало), ещё не хватает фронта А я сам 1сник, сижу тужусь и понимаю, что подобную хуиту в 1с накидать работы на 4 часа максимум и там ещё будет из коробки фронт к этому всему. Сука руки опускаются и как обычно мысли уровня "а тем ли я занимаюсь блядь?". Скажите, мне просто нужно взять себя в руки или я реально делаю что-то не так и можно лучше (в плане взять проект в котором го реально будет блистать)? Это не троллинг если чё
>>2755873 > А я сам 1сник, сижу тужусь и понимаю, что подобную хуиту в 1с накидать работы на 4 часа максимум и там ещё будет из коробки фронт к этому всему. Если нужно очень быстро - попробуй https://gobuffalo.io/
>>2755882 >то, что нельзя реализовать в 1С Способность справляться с большими нагрузками в основном. Ну и возможность создавать свои индексы в бд в 1с очень порезана, она есть, но через жопу, особенно когда ты хочешь кластерный сделать такой как тебе надо. Это опять же в копилку производительности всей системы в целом. И возможность без кучи бойлерплейта делать нормальную интеграцию с другими приложениями. В 1с из-за динамической типизации нужно городить кучу верификаторов, конструкторов и прочего безобразия. А числодробилок в этом конкретном проекте нет. >>2755878 Хм, интересно, погляжу на досуге. спасибо
>>2754190 Спасибо, но в твоем примере сама очередь конечна. В общем сложная тема, согласен, думаю сделаю проще - запущу несколько горутин, которые делают периодические запросы каждый по своему урлу, воркер с обработкой ответа в этой же функции будет. Рейт лимит может быть заюзаю тот, что ты кинул, либо сделаю простой на RW мютексе, либо в первой итерации проекта вообще откажусь от рейтлимита.
>>2755849 Еще момент учитывай, что если внутри func_slice использовать append, то массив может быть создан новый и добавляемые элементы не будут добавлены в массив оригинального слайса.
Анон, вынес конфиг своей приложеньки в yaml, создал отдельный пакет, инициализацию сделал через once. Но возник вопрос с инкапсуляцией полей структуры конфига, т.к. поля должны быть видимы вне пакета, иначе оно не анмаршалится. Т.е. в других пакетах можно просто взять конфиг и напрямую поменять поле. Понятно, что никто в трезвом уме делать так не будет, но формально это все же нарушение инкапсуляции и иммутабельности. Можно конечно сделать структуру-враппер, которая ембеддит оригинальную и навесить на нее геттеры, которые возвращают значения полей исходной структуры. В общем как в го реализуется внешнее конфигурирование?
>>2757184 >Понятно, что никто в трезвом уме делать так не будет, но формально это все же нарушение инкапсуляции и иммутабельности это го, привыкай. тут можно io.EOF = nil сделать.
>>2757233 Можно и в джаве такое сделать, только там нет не помню необходимости поля класса наружу выставлять Посоветуйте го-либу для парсинга ямла, где нет такой беды
Такой вопрос: как часто вы используете context.Context? Я не про просто пробрасывание ниже по цепочке вызовов, а создать новый с таймаутом, запустить что-то в бекграунде и т.п.? Какие есть бест практисиси?
>>2757872 смирись, чел. иммутабельность в гошке это когда в комменте написано "не меняйте плз". >Посоветуйте го-либу для парсинга ямла, где нет такой беды ну ты в принципе не заанмаршалишь в приватное поле. ну ладно допустим ты затащил весь код парсера в пакет с конфигом, чтобы приватные поля были доступны парсеру. и теперь у тебя конфиг с приватными полями, которые не видны из других пакетов. а теперь ты навешиваешь геттеры на всю эту хуйню. а теперь твой код превратился в жаву
>>2758140 у нас туда засовываются поля для логирования - в хендлере запихиваешь поля из реквеста, там userID хуе-мое, и все внутренние логи будут с ними. аналогично этому в мидлваре можно положить что-то. NotifyContext в main. при консюминге очереди - явные таймауты, чтобы не застопить обработку на какой-то хуйне. если у тебя сетевой поход во время открытой транзакции в БД (так делать не нужно еба), то тоже надо быть уверенным, что на него есть таймаут. контекст от ErrGroup также нужно смотреть когда логично использовать, а когда не надо.
>>2757184 >>2758143 >смирись, чел. иммутабельность в гошке это когда в комменте написано "не меняйте плз".
В общем таки пришлось обмазать враппером, который содержит указатель на мутабельную структуру, но вне пакета к мутабельной нет доступа. Олсо, а как обеспечивается иммутабельность полей-слайсов? Т.к. слайс содержит указатель на массив, то даже получив его копию можно заппендить в оригинальный массив, хотя нет прямого доступа к полям-слайсам конфигурации. Возвращаю в геттере новый слайс в который копирую элементы оригинального. Я долбоеб и надо было забить или можно так двигаться в Го?
>>2758143 >теперь у тебя конфиг с приватными полями >а теперь твой код превратился в жаву ну как бе с одной стороны да, с другой тем самым можно обезопасить от прострела ноги
можно конечно положить болт, и каждый раз при обращении к конфигу извне возращать копию структуры, а не указатель на нее, но тоже как-то ебано копировать всю структуру ради одного поля
>>2758199 >ну как бе с одной стороны да, с другой тем самым можно обезопасить от прострела ноги да никто не будет твой конфиг внутри бизнес-логики менять, нахуй это надо. ну т.е. это вообще не-проблема в реальном коде. если ты хочешь альтернативный вариант, то просто не передавай свой ямловый мегаконфиг дальше main. все типы/пакеты, которые ты там инициализируешь, тупо должны принимать значения нужных себе опций на вход NewZalupa() вместо общего конфига. >но тоже как-то ебано копировать всю структуру ради одного поля нуу будет у тебя приложуха на две наносекунды медленее запускаться и жрать на килобайт памяти больше на старте.
>>2758213 >да никто не будет твой конфиг внутри бизнес-логики менять, нахуй это надо. ну т.е. это вообще не-проблема в реальном коде. Ну да конечно. Возьмет слайс с чем нибудь из конфига, отдаст в функцию которая вообще не в курсе что это и откуда и там уже меняет элементы слайса.
По какому принципу горутины синхронизируются каналами?
Допустим, у меня в мейне две одинаковые горутины с двумя каналами: ro[2] и wo. В функции горутины берутся 2 значения из ro и кладется значение в wo. В мейне в канал ro[2] последовательно кладется 4 значения. Никому ведь неведомо в каком порядке они достанутся в горутинах? Я просто решил проверить в цикле и у меня стабильно сначала считается 1 значение из канала в обеих горутинах по очереди, потом 2 значение точно так же. То есть go XXX: <-ro go ZZZ: <-ro go XXX: <-ro go XXX: wo<- go ZZZ: <-ro go ZZZ: wo<
И такой порядок, судя по аутпутам внутри горутин, сохраняется.
Это мне просто повезло получить воспроизводимый результат, или планировщику так дано работать? Или тут вообще не про планировщик, и я сам явно так синхронизировал все?
>>2759855 короче я почти нихуя не понял из твоего описания. но я бы ожидал примерно такое поведение
1. запускается программа 2. спавнит GOMAXPROCS тредов-процессоров. все кроме одного процессора не имеют работы и засыпают (тут на самом деле не уверен и возможно дополнительные процессоры будут спавниться потом по мере. остальные пункты имеют смысл только если это работает так, как я сказал.) 3. main горутина начинает исполнятся 4. все go func() горутины, которые ты делаешь, кладутся в локальную очередь процессора, который исполняет main 5. когда main блочится на чём-то, процессор, который крутил main горутину, берёт последнюю go func() которую ты заспавнил (т.е. очередь горутин не fifo) и начинает выполнять её 6. в какой-то момент остальные процессоры просыпаются и воруют горутины из очереди main процессора.
если ты всегда получаешь один и тот же результат, то возможно оно всё успевает выполниться на одном треде, когда остальные треды спят без работы.
>>2759895 Звучит правдоподобно. Про стек глубиной 1 для свержих горутин читал. > Все кроме одного процессора не имеют работы и засыпают Видимо так. Но почему...
Анон, есть проблемка с отменой контекста и завершением работы приложения. В общем, использую NotifyContext для своей утилиты, если ловлю сигнал от OS, то отменяю контекст, который по цепочке прокидывается во все горутины и функции. Есть некий воркер, который по тикеру выполняет функцию, которая может уснуть или так же может быть прервана в случае получения сигнала (т.к. пробрасывается контекст). Проблема в том, что сигнал на прерывание от ОС может быть получен в момент, когда функция searchForPost спит (т.е. ждет либо отмены контекста, либо записи в канал <- time.After). Получается, что функция может быть в какой-то момент отменена и ожидается, что DoWork завершится кейсом с ctx.Done. Но тикер за время сна успевает видимо подкинуть еще элемент и он срабатывает первым, в результате функция searchForPost срабатывает лишний раз в каждом воркере перед самым завершением работы утилиты. Не понимаю пока, какой тут паттерн/антипаттерн, как сделать так, чтобы если контектс отменяется, то все селекты с ним мгновенно завершались (ну или схожее поведение)?
>>2762555 ты зафокусился на какой-то супер-редкий кейс, когда тикер и контекст одновременно доступны. селект в этом кейсе выберет рандомный кейс. у тебя скорее всего что-то другое происходит, т.к. отменить контекст именно в момент тика надо умудриться. что ты можешь сделать - в кейс с тикером добавить проверку if ctx.Err() != nil { return }. но как я и сказал, это супер-редкий кейс и эта проверка тебе 99.99999% не поможет (плюс эта проверка где-то внутри searchForPost должна же уже быть, если оно сетевой поход делает).
>>2762570 >>2762566 Спасибо, проверка ctx.Err() != nil решила проблему. Да весь подвох в том, что searchForPost может блокироваться, т.к. упирается в счетчик рейт лимита сетевых вызовов и просто ждет N секунд до сброса лимита. Хорошо бы еще понять насколько легально и разумно блочить функции, вызываемые внутри селекта и которые могут быть прерваны отменой контекста. >>2762573 searchForPost к сожалению не возвращает ошибки by design, т.к. любой результат ее выполнения считается успешным, а внутренние ошибки просто пишутся в лог. Не хотелось бы ради корректной обработки отмены контекста прокидывать оишбки назад по всему стеку вызовов.
Даны два канала, из обоих можно прочитать конечную неубывающую последовательность целых чисел. Необходимо объединить два канала в один канал, который так же генерит неубывающую последовательность. Подзастрял с этой задачей, нашел решение только с промежуточным вычитанием исходных каналов в слайсы и последующей отправкой в результирующий канал. https://go.dev/play/p/Y7lZmdMnGOU Вроде и норм, но по памяти накладные расходы и пайплайн по сути блокируется до момента окончания записи в исходные каналы. Можно ли сделать как-то на селекте, без ожидания полной вычитки каналов? А если последовательность условно бесконечная?
>>2765876 так же, как два мосива смержить. читаешь по одному значению из двух каналов. пишешь в выход то, что меньшее (допустим это был канал А). читаешь из канала А, пока он возвращает значения <= значения из Б и кладешь в выход. когда значение попалось больше, то кладеш то большее из Б и читаешь из Б с тем же условием.
Как вы пишете интеграционные тесты (на моках)? Например у пакета есть экспортнутый метод, который под капотом зовет внутренний метод пакета, который под капотом делает http-запроса. URL запроса берется из конфигурационного файла, а за конфиг отвечает отдельный пакет. Про httptest в курсе, но там два пути: либо подставлять в реквест http-клиента URL тестового сервера, либо подменить url у тестового сервера, на тот, чито указан в тестовой конфигурации. Второй подход вроде как рисковый, т.к порт может быть занят на момент прогона тестов. Первый же выходит через какие-то костыли с глобальными переменными и манки патчингом. Бля, хоть свой спринг пиши.
>>2768273 Конечно можно конфу передавать в каждый метод через контекст/аргумента (а сам аргумент подставлят ьв тестах), либо написать отдельный конфиг для тестов, но должно же быть что-то проще.
>>2768348 Зачем этот высер слияния каналов с рандомными интами? Проблема в чтении каналов в определенном порядке, который может меняться в зависимости от поступающих значений
Ребят а вам не страшно что телефон без влагозащиты? Вот ща дождик идет и я чет задумался, а как им пользоваться то на улице? Надо было брать самсунг а54....
>>2768273 >"""интеграционные тесты (на моках)""" у тя сложные тесты какие-то. ну типа если нужен порт, то ты всегда можешь с ретраями подобрать свободный, и если хочешь тестабилити не нужно порт хардкодить/читать из конфига. а вообще если это всё на моках, то нахуй это интеграционный тест
>>2768714 Такой проектик, юнит тесты хороши для бизнес логики, когда можно изолированно от других слоев тестировать. А если есть сеевые вызовы внутри логики, то как без моков.
>>2769268 Скорее это вопрос устоявшейся терминологии. Под интеграциюнными понимают тесты, которые задействуют несколько слоев/модулей приоложения. Например ты хочешь протестировать слой-репозиторий, для этого мокаешь запросы к БД. Тоже самое с сетевыми вызовами. Юнит-тесты это тестирование изолированной функциональности в рамках одного модуля. Например тестирование функции, которая делает какие-то расчет, без сайд эффектов. То, что ты называешь интеграционными это системное тестирование или end-to-end, когда тестируется на стенде. Другое дело, что как в моем случае у меня нет чистых функций практически, все завязано на коннекты.
У меня есть директория с файлом go.work. В директории есть несколько модулей, которые содержат пакеты. Как мне импортировать пакет components из модуля tables в модуль data? import "go.work/tables/components" не работает (это гопота предлагала)."tables/components" тоже. "./tables/components" запретили давно.
>>2768273 >Как вы пишете интеграционные тесты (на моках)? Никак. Интеграционные тесты - проверяют интеграцию между разными компонентами. В интеграционном тестировании поднимаются реальные инстансы всех компонентов, максимум можно мокать внешние системы. Но предпочтительней, чтобы у них была внешний UAT.
>>2769315 да, у нас терминология другая. допустим, у тебя есть тип А с логикой, завязанный (через интерфейс) на тип Б. если ты тестируешь отдельно метод у А, мокая Б, то это юнит-тест, независимо от того, делает ли реальный Б под капотом сетевые вызовы или это тупо какой-то калькулятор. аналогично тесты для репозитория без поднятия БД, т.е. любые тесты без внешних зависимостей это юнит-тесты. интеграционные - когда нужно поднять бд/редис/очередь и тупо go test ./... не пройдёт. вызовы в другие сервисы по хорошей практике все равно мокаются. системные/е2е - когда ходим в реальные внешние зависимости.
>>2770758 я обычно разделяю, интеграционные в _integration_test.go (+ билд флаг в них), юниты в _test.go. хотя обычно один пакет не тестируется одновременно юнитами и интеграционными и порой можно видеть интеграционные в _test.go
>>2771033 https://go.dev/play/p/CErOI1HrNXq И не перетрет, если в результате аппенда будет создан новый массив. Этот момент в Го напрягает, конечно, если в коде акробатика со слайсами. 10 раз подумаешь, а стоит ли аппендить в этот слайс или создать новую копию. Чому не завести было высокоуровненвые абстракции?
>>2771948 > 10 раз подумаешь, а стоит ли аппендить в этот слайс или создать новую копию. Такая и была цель, чтобы не делать неявно О(n) операции > Чому не завести было высокоуровненвые абстракции? Например как?
>>2772115 >Например как? Например как в нормальных языках - List. Который при добавлении элемента растет внутри, но сама ссылка на List остается актуальной. А еще можно сделать 2 интерфейса - mutable и immutable. А ещё можно всякую функциональщину типа map завезти.
Ладно, это я увлекся, это все не говей, ебитесь с кучей бойлерплейта и не жалуйтесь.
>>2772213 > Например как в нормальных языках - List В нормальных языках никто алокации не считает и срут в хип всем чем только можно. В го же подобную структуру можно реализовать на основе слайса очень просто, но в отличии от слайса она никогда не будет на стеке, т.к. нужны поинтеры
> А ещё можно всякую функциональщину типа map завезти. Уже
>>2772617 Нет, чел. Это в с++ ты можешь языковыми средствами реализовать вектор и хештеблицу и любую другую структуру данных. А у вас долбоебы сделали частью языка хэштаблицу, это же уровень php
>>2772627 >это же уровень php В 1с тоже хештаблица часть языка, причем используется везде где в си и go используется struct, потому что в 1с нет структур в привычном понимании, динамикодрисня же. Причём в доках нигде не написано что это хештаблица, но по контексту можно догадаться. Эх...
>>2772617 >В нормальных языках никто алокации не считает и срут в хип всем чем только можно. В го же подобную структуру можно реализовать на основе слайса очень просто, но в отличии от слайса она никогда не будет на стеке, т.к. нужны поинтеры Ты совсем ебанат который вообще не шарит? Слайс аллоцирует в куче массив, а на стеке указатели на массив, длину и сегмент. Джава или Шарпе будет делать ровно то же самое, только структура указатели на массив, длину и сегмент будет тоже аллоцирована на стеке, что позволяет не ебаться с >slice = append(slice, newElement) а просто >list.add(newElement) Разница в аллокации памяти мизерная. Массив для хранения данных и там, и там в куче. Ресайзится кратно текущему размеру амортизированное O(n) для тех кто шарит. Нету нихуя у слайсов, каких-то преимуществ перед List.
>Уже И как мне []string преобразовать в []Yoba в функциональном стиле?
>>2772627 >А у вас долбоебы сделали частью языка хэштаблицу, это же уровень php Аутистам у кого Го первый язык, это не понять.
>>2774008 > Слайс аллоцирует в куче массив, а на стеке указатели на массив, длину и сегмент. Джава или Шарпе будет делать ровно то же самое, только структура указатели на массив, длину и сегмент будет тоже аллоцирована на стеке, что позволяет не ебаться с ну вообще-то слайс и на стеке может быть аллоцирован полностью, включая внутренний массив, если он не убегает и ты подходящий размер укажешь.
>>2740805 (OP) Вкатываюсь в го, синтакс более менее освоил Сейчас начал делать "пет проект". Фантазии нет, делаю абсолютно бесполезную хуйню Цимес в том, что в моём проекте на Go буквально 40 строк, остальное делает JS. Это вообще норм или рекрутеры скажут что с такими приколами чтобы шёл на js разраба? Ещё планирую прикруть базы данных, но там тоже не сильно сложно
>>2774365 >Ещё планирую прикруть базы данных, но там тоже не сильно сложно Обязательно прикручивай, иначе нахуя тебе вообще бекенд? Чтобы было больше, делай не с гормами, а с чистым sql Тем более что в проде зачастую так оно и происходит
>>2774377 >>2774400 Понял, спасибо Хочу вкатиться на джуна и основной упор сейчас на алгоритмы и структуры данных, а дальше ещё паттерны хотя бы по верхам нужно освоить и всякие kubernetes, docker... Проект делаю когда есть вдохновение.
>>2774365 Сейм стори, тоже вкатываюсь, один сервис почти допилил, планирую еще парочку и интеграцию между ними сделать по rest и черезь очередь, в сумме должно норм быть.
>>2774377 В go правда большинсто проектов не использует ORM? Имел опыт в джаве с этим самым хибернейтом, так и не проникся философией ORM. Чтобы написать, что-то чуть сложнее круда приходится все равно писать sql только через обертки orm-мовские и еще проблема n+1 из коробки. В го с orm такая же история?
>>2774524 Без опыта и не профильное образование учитель музыки. Сейчас учусь заочно на программиста параллельно совмещая с работой и заодно готовлюсь к собесам, если меня на них ещё позовут...
>>2774545 А зачем из творческой сферы ты идешь в унылое программирование, где придется по 12 часов сидеть за ПК и все свободное время так же заниматься программированием?
>>2774114 >>2774116 Таки и в C#/Java эскейп анализ тоже есть, и JIT тоже может на стеке аллоцировать. Просто ты мудило, не можешь в контекст. >10 раз подумаешь, а стоит ли аппендить в этот слайс или создать новую копию. Подразумевает, что слайс пробрасывается куда-то наружу, явно за пределы эскейп анализа.
>>2740805 (OP) Для особо тупых: Одна из распространенных жалоб на Go заключается в том, что обработка ошибок слишком многословна. Это абсолютно верно; каждый раз, когда вы видите, что функция возвращает ошибку, вы должны проверить, является ли ошибка нулевой, и правильно ее обработать. Языки, которые используют исключения для обработки условий ошибок, не делают явную проверку ошибок, что часто приводит к хрупким программам, которые плохо справляются с обработкой ошибок. Делая ошибки настолько заметными, Go побуждает разработчиков поступать правильно и создавать более надежные программы.
>>2775900 В результате чего имеем всякие MustCompile() и сранье в аутпут при ошибках в шаблоне sprintf.
Насчёт должен обработать, у Джавы есть checked exception. И как показала практика - говно идея, только засирает код. Проще на верхнем уровне ловить панику/эксепшены и писать их в лог.
>>2776629 Собственно обработка check exception и есть тот самый err != nil Ошибки "не check" ловится могут на самом верхнем уровне без каких-либо дополнительных усилий, т.е. это и есть своего рода паника. Я бы не сазал, что явные экеспшены как-то засирают код, другое дело, что конструкции для ловли могут побудить использовать их как условные операторы для разруливания веток кода, что не есть хорошо. Кмк, в Го как раз решена эта проблема, ловишь в defer recover и выполнение на этом функции завершвается в любом случае или в if err != nil, где явно делаешь возврат.где пишешь простыню с резервным сценарием
>>2775652 >и ни слова об эскейпе со стека в цитате. что подразумевается? куда наружу? Очевидно что со слайсом который создан внутри метода и используется только внутри метода не возникает вопросов >а стоит ли аппендить в этот слайс или создать новую копию Речь явно идет про слайс который или получен снаружи, или прокидывается куда-то внутрь и непонятно что там с ним дальше будет.
>>2777048 >Собственно обработка check exception и есть тот самый err != nil Только в Джаве можно один раз написать throws ZalupaException, а в Го каждый раз ебаться с if err != nil { return nil, err }
>Кмк, в Го как раз решена эта проблема, ловишь в defer recover и выполнение на этом функции завершвается в любом случае или в if err != nil, где явно делаешь возврат. panic-recover это и есть throw-catch в чистом виде. Более того его сами авторы Го используют его именно таким образом.
>>2777306 >каждый раз ебаться с if err != nil { return nil, err кидай панику, если уверен, что ошибка на самый вверх должна пойти и с жизнью не совместима
Иначе ты все равно будешь писать if err != nil, только используя try catch
>>2777306 >Только в Джаве можно один раз написать throws ZalupaException, а в Го каждый раз ебаться с да не обязательно. для всех функций с ошибками тупо скипаешь ошибку v, _ := zalupa() и когда-нибудь паникнешь. ну и в мейне просто такой же дефер на всё-всё как в твоей джаве))
>>2777881 Лучше бы приводило к возврату ошибки, если функция её возвращает, и к панике если нет. И пустой идентификатор уже используется, лучше новый токен взять, например знак вопроса. Осталось только придумать как добавлять контекст в таком случае
>>2777855 >кидай панику, если уверен, что ошибка на самый вверх должна пойти и с жизнью не совместима Увы и ах, код-ревью не пройдет. Паниковать можно только в ситуациях инициализации на старте и тестах. В нормальном режиме паниковать нельзя. Пример их жизни, парсим строку регуляркой \d+, потом ее Atoi в число. Понятно что не должно быть ошибки, но тем не менее код-ревью завернули. Нехер паниковать в прод коде.
>>2777877 >да не обязательно. для всех функций с ошибками тупо скипаешь ошибку v, _ := zalupa() и когда-нибудь паникнешь. ну и в мейне просто такой же дефер на всё-всё как в твоей джаве)) В джаве можно ловить ошибку, а потом ее тупо перебрасывать с сохранением стектрейса, в Го - хуй вам. Бросай новый и ебись с логированием старого стектрейса. В фреймворках у тебя нет майна, есть минимальный контроль над обработкой ошибок.
>>2777855 >>2777877 Это все к чему. Говей это ебстись с if err != nil { любой другой выебон с panic-recover создает проблемы с поддержкой кода.
>>2777999 С одной стороны да, можно уменьшить боейлерплейт, а с другой будет отсутствовать дополнительная ишва. Напримиер ты в 3-х местах ты читаешь из базы и у тебя появляется DB: syntax error, как понять где?
>>2778089 >Увы и ах, код-ревью не пройдет. Весьма странно В том же effective go приводится пример когда с паникой прокидывается ошибка с кастомнын типом (аля MyCustomErr extends Runtime Exception) В defer получаешь из recover ошибку и чекаешь тип, если кастомный, то обрабатываешь, если нет, т опаникуешь дальше https://go.dev/doc/effective_go#errors
>>2778896 >В том же effective go приводится пример когда с паникой прокидывается ошибка с кастомнын типом (аля MyCustomErr extends Runtime Exception) Во первых они сами пишут, что это на крайний случай, если прям совсем не можешь продолжить работу: >This is only an example but real library functions should avoid panic. If the problem can be masked or worked around, it's always better to let things continue to run rather than taking down the whole program. One possible counterexample is during initialization: if the library truly cannot set itself up, it might be reasonable to panic, so to speak. У нас тоже можно паниковать в ините если критичная проблема, а вот панику в методе библиотеки мне завернули, хотя по идее она и не должна в нормальной ситуации произойти.
Нет ли плагина, чтобы в VS code создавать заглушки для методов типа, который имплементит интерфейс? Может это все не говей, но в идейке было удобно, когда онасама клепала заглушки методов.
>>2780501 Есть почти всё, но реализовано так что куча кода на ровном месте. Нет конструкторов, поэтому приходится делать тип приватным, объявлять интерфейс включая все геттеры/сеттеры hello Java my old friend и писать New() метод. На уровне языка нельзя сказать, что тип реализует интерфейс, надо костылить через присваивание. Нет иммутабельных данных, так что вся надежда на сознательность вызывающего. Нет нормального наследования, создать базовый класс и чтобы кому надо расширял его нельзя.
>>2780795 >Нет конструкторов, поэтому приходится делать тип приватным, объявлять интерфейс включая все геттеры/сеттеры кринж >На уровне языка нельзя сказать, что тип реализует интерфейс, надо костылить через присваивание. зачем? >Нет нормального наследования, создать базовый класс и чтобы кому надо расширял его нельзя. так это плюс
Перекат с жабы - чек. Как вы пишите интеграционные тесты для репок? Используете sqlite или поднимаете локальный инстанс целевой базенки? А схемы БД чем мигрируете?
>>2781701 >Используете sqlite или поднимаете локальный инстанс целевой базенки? в ci поднимается постгрес в докере, накатываются миграции, и тесты работают с этой базой. для локальных тестов - аналогично, только в миникубе. >А схемы БД чем мигрируете? хз, какой-то отдельный контейнер есть, который накатывает всё.
>>2783581 Ну там для примитивных крудов, типа накидал структуру и прикрутил к ней интерфейс, добавил теги или передел в метод хз как у вас там и готово, работаешь со структурой как с таблицей. Или в го такое не актуально и тупо везде голые sql запросы? Мимо
Есть ли в целом в ГОшке вакансии для челов без предварительного опыта в бэкенд разработке? Сам занимаюсь бч разработкой на Solidity два года, хочу расширять стек. В бч-сфере преимущественно вижу разработку бэка на ноде, либо разработку бч на той же гошке. Есть, конечно, и разработка на расте, но там смертью пахнет.
>>2783474 Сам только вкатываюсь, но во что получается по результатам ресерча: Sql - PostgreSql No-sql, кэши - redis, MongoDB Транспорт - kafka, rabbitMQ, grpc web-фрейворк - gin Тестирование - пакеты testify, тулза gomock Контейнеры, облачные сервисы - docker, kuber, aws
Остальное так понимаю покрывается стандартной либой + пакетами от третьих лиц
>>2785423 Если нет высоких нагрузок, то ничего лучше питона еще не придумали. А так - компилируемость, статическая типизация, удобная работа с многопоточностью, отсутствие GIL.
>>2787427 У них разные ниши, не совсем правильно сравнивать. Но если так, то го проще намного для разработчика. Ну и он всё же ближе к вебу, а раст больше в системщину
>>2787451 >топовые специалисты ценятся в системном программировании Следует добавить что для этой хуйни особый склад ума нужен. У меня в кругу буквально пара человек этим занимается, один из них дохуя востребованный спец, года в 23 в Японию в соляного перекатился вообще без проблем.
>>2787394 ну гошка это по сути новая пыха. юзкейсов больше, но 99% вакух будет по сути тот же бэкенд. идти в раст это все равно то же, что уходить в плюсы - графика, системка и те штуки, которые раньше писались на плюсах/сях, чтобы було быстро. так что можешь вернуться на 15 лет назад и подумать куда ты хочешь.
>>2787809 >Может кто объяснить зачем тут len-1? чет слышал что в гошке есть какая-то хитрость с жтим. Нет никакой хитрости в Еошке, это просто алгоритм такой. Пусть у тебя есть слайс [0, 1, 2, 3, 4] ты берешь первый цикл по [0, 1, 2, 3], а второй по первый + 1.
>>2787839 >Никакой хитрости нет, у массива длины n самый большой индекс это n-1, т.к. первый индекс - 0 Там строго меньше, это значит что они итерируются до предвоследнего.
>>2788490 >а второй по первый + 1. а второй от первый + 1 до последний.
>>2787576 как-то грустно, что только пыха Но вроде бы веб/микросервисы в современном мире - это и есть 99% вакух, вне зависимости от языка? Еще криптостартапы на гошке пилят
>>2789796 Походу парсер сожрал скобки, я понял в чем проблема. Ты неправильно работаешь со строками. Го это тебе не Джава, тут свои оригинальные решения. Строка это не последовательность символов, строка это последовательность байт, которые являются строкой в UTF-8. Соответсвенно str{n} скобки квадратные, а не фигурные это N-ый байт, а не символ. Работать с символами надо по другому.
>>2789792 >Ну хорошо, а что заставляет людей писать "var"? Страх, что код не скомпилируется? То что это объявление на уровне пакета. Ты вообще местный йумор не оттдупляешь.
>>2789815 >Как такие задачи решать, если не знал про всякий utf8 encoding и так далее? Гуглишь проблему, в данном случае что-то типа google://golang string nth element Там будет что-то типа: https://medium.com/@kdnotes/when-i-index-a-go-string-at-position-n-why-dont-i-get-the-nth-character-cfc03e0af541 где будет >To answer the question posed at the beginning: Strings are built from bytes so indexing them yields bytes, not characters. там же >“Code point” is a bit of a mouthful, so Go introduces a shorter term for the concept: rune. Из чего можно сделать вывод, что надо почитать про rune и как строку разбить на rune. Код который я привел это копипаста кроме if и документации к пакету unicode/utf8.
>>2789792 Смех смехом, но в зависимости от того использовал ты var для объявления переменной внутри функции или сразу присвоил значение может зависит, где именно выделить память, в стеке или на куче. Это конечно байтоебство и душные кишочки, но довольно интересно, т.к. по сути можно писать не читаемый говнокод, который будет оптимальнее работать
>>2789871 > но в зависимости от того использовал ты var для объявления переменной внутри функции или сразу присвоил значение может зависит, где именно выделить память, в стеке или на куче примеры будут?
Нужно супер быстро выучить го. Собес на этой неделе. Знаю плюсы и питон. Что посоветуете? Тур прошёл, но литкоды всё равно туго решаю. Забываю элементарные вещи типа области видимости переменых
>>2789883 Смотри моковые собесы по го, на русском языке контента часов на 10, гугли ответы на вопросы или просто старайся запомнить. Олсо, как получил приглашение на собес без коммерческого опыта в го и петов?
Перевожусь в другую команду внутри компании. Тот же почти продукт только теперь компоненты на го есть. Нашу команду продали партнёрам, а я уходить из компании не хочу. Поэтому собес такой внезапный. Сам в го не хотел
>>2790371 Ну тащемта первое по нулям если я правильно помню, что конст сайз арреи в гошке не поинтерами идут, пользуюсь хуй пойми да раз в год в лучшем случае, второе будет 012, но только если ты длину вручную модифнешь, аля slice[:3]
>>2789881 1. Как сказали в комментах: автор очень косноязычный и некоторые вещи понять нереально. Отношения интерфейс-структура, он очень криво объяснил, на середине отвлекся и часть не договорил. На тему почему часть отношение интрефейс-интрефейс всегда идут в динамике, вообще что-то невнятное промычал что мы типа не всегда это можем знать. А вот вторая часть про аллокации, там намного четче и бодрее. Сразу видно что первую часть он пересказывает, то что читал у других, а второй сам занимался. 2. Это не данность, как он сам сказал все зависит от компилятора - по мере улучшения анализа поведение может меняться. 3. Он вообще не говорил про стиль декларирования := vs var, он говорил про ссылка vs не ссылка, и как влияет разная инициализация полей b.data = new(byte) vs box{data: new(byte)}. Просто он реально не умеет делать доклады и даже простые вещи не может объяснить нормально.
Вообще всю эту хуету можно и самому проверить и убедиться что := vs var влияет ссылка/не ссылка и как потом с этими данными обращаются. https://pastebin.com/jUzaqzRK Но двощеры предпочтут пересказывать друг-другу одни и те же легенды
>>2790659 >>2790682 Какой же ты хлебушек. Чел час распинался про эскейп анализ, когда он работает, а когда нет. Потом приходишь ты и специально возвращаешь ссылку на объект, чтобы компилятор на 100% был уверен, что ссылка утекает. Речь шла именно про случай когда объект используется только внутри метода.
https://godbolt.org/z/YEnxM344c Вот тут как раз видно, что Dumber1_1 и Dumber1_2 вызывается runtime.newobject() аллокация в куче, а в Dumber2_1 - нет аллокация на стеке.
>>2790840 Речь о том, как это технически реализовывается, а не поведение. Что будет если есть два интерфейса в разных пакетах, но с одними и теми же методами.
Анон, пишу простенький рест круд, собственно вопрос как правильно обрабатывать кейсы, когда GET или DELETE не находят запись в базе. Например select в гете ничего не нашел, в этом случае репозиторий должен вернуть nil указатель и сервер должен ответить 404? А если апи не рест и всегда нужно возвращать какое-то значение? Как во втором случае отличить zero value от не найденного значения? Например есть структура с тремя int, как отличить 0,0,0 - значение найденное в базе, от такого же но ненайденнго с zerovalue?
>Например есть структура с тремя int, как отличить 0,0,0 - значение найденное в базе, от такого же но ненайденнго с zerovalue Ты буквально сам же предложил решение
>>2791566 В случае если ничего не найдено ты не обязан даже null возвращать. Просто возвращаешь респонс с кодом 404 и без body Разные виды респонсов для разных кодов
>>2791571 >>2791537 Спасибо за ответы и прости за духоту, но спрошу таки, как грамотно вернуть ошибку контроллеру/юзкейсу в случае если не найдена строчка nil, nil в случае, если не найдена запись норм вариант? Можно было бы и просто nil, err возвращать, но тогда в контроллере явная зависимость от пакета sql по сути не нужная
>>2793919 Кстати, насчёт свитчеров. Я понимаю вопрос дебильный, но мож у кого-то просто опыт схожий был. В общем ща я получаю 2к. Если свитчнусь в го, насколько можно просесть по зп, при условии что я не буду притворяться, что имею коммерческий опыт в го? Просто прикидываю свои силы, можно ли уже сейчас пробоваться, или надо ещё поднатаскаться чтобы за своего пройти. Хотя с другой стороны я могу просто походить на собеседования и выяснить.
>>2795108 Не об этом вопрос. Вопрос будут ли пытаться интенсивно пытаться прогнуть по зп ниже 2к если увидят отсутствие опыта в го, даже если на интервью норм справляешься. Но можешь не отвечать, я уже понял что никто этого не знает.
>>2794350 Зависит от твоего опыта. Меня брали без опыта в Го и на большую зарплату. Начиная с некого уровня предполагается, что ты способен выучить язык по ходу.
>>2795114 ну я просто один из кейсов описал, который может повлиять. у бэков есть выбор собеситься на гошке или пыхе/паре других языков. если выберешь проходить на гошке, но будешь хуево отвечать, ты потеряешь шанс показать что ты сенёр в пыхе и тебе дадут хуевую оценку. и возможно не найдется команд, которые тебя решат взять. >я уже понял что никто этого не знает очевидно, т.к. от компании к компании по-разному.
у нас пыхеров без опыта в гошке часто видно на собесах. сомневаюсь, что их намеренно просаживают - кандидаты тогда просто не будут офер принимать.
>>2793919 для гошников, стажеров и свичеров-сеньоров. пробуйте на стажировку попасть, чтобы как этот >>2795273 хуй 2 года не мучаться на пыхе с тем же результатом.
>>2797541 Можешь юзать индентацию, просто открывающая { должна быть в той же строке, что main(). Вероятно, это как-то связано с избавлением от semicolon hell.
>>2797564 Гайдлайн я имею ввиду на уровне языка. Как раз да, наверное из-за точек с запятой так делать и нельзя, ору нахуй челам не хватило извилин запилить адекватный парсер исходников и они забанили тупо кодстайл.
Че там у тебя компилируется - я хз, ты может провтыкал автоформатирование или еще что?
>>2797599 Ну, мне тоже нравится фигурная скобка с новой строки, потому что так естественным образом отделяется практически пустой строкой название функции от первой строки ее кода. В старых сях такой стиль был. Ну а в современных крестах уже в одну строку пишут. Может голэнгщики просто отдельное правило для парсера не хотели добавлять ради этого, тут стоит только начать, и у тебя уже через некоторое время будет дохуя отдельных правил.
>>2797555 this В го команды отделяются семиколоном, просто он не явно подразумевается в определенных случаях при переводе строки, в спеке есть описание.
> https://pkg.go.dev/strings#Builder.WriteString > WriteString appends the contents of s to b's buffer. It returns the length of s and a nil error. >the length of s and a nil error. >a nil error. Какой же, блядь, замечательный язык! Как мне повезло на нём писать!
ДЕБИЛЫ ЕБУЧИЕ! ВЫ БЫ ХОТЬ ПОСМОТРЕЛИ НА СТРИНГ БИЛДЕРЫ В ДРУГИХ ЯЗЫКАХ! НИКОМУ НАХУЙ НЕ УПЕРСЯ НИ ДЛИННА, НИ ТЕМ БОЛЕЕ NIL ERROR. ПИДОРАСЫ ЕБУЧИЕ, ВЕРНИТЕ САМ Builder!
Извините, я пишу на Го, поэтому немного несдержан.
>>2797696 Возвращать сам объект из метода [пере]изобрели в jQuery, то есть в жопаскрипте, чтобы можно было нахуячить цепочку object.method1().method2().method3(). Это решается и другими методами. Хотя я вот сам в крестах такое часто использую, чтобы превратить программирование на крестах в программирование на жопаскрипте, на что некоторые крестолухи ругаются, да и хуй с ними.
>>2797484 >Проекты интересные иногда да, иногда простенькие. каждую правку можно самому пощупать и понять как оно на пользователей влияет. если есть крутые идеи, то ты как разработчик можешь их сам тоже предложить. >сильно дрочат за производительность из-за хайлоада от команды к команде, не у всех супер-нагруженные сервисы. на уровне кода обычно байтоебства нет. максимум попросят слайс преаллоцировать, последовательные сетевые походы переделать на параллельные, ну и индексы в бд конечно же. по большой части надо чтобы архитектура скалировалась и твоя хуйня не стала ботлнеком/не валила флоу пользователя - грейсфул деградировала, асинхронно выполнялась, когда возможно, и т.п. Нагрузку считать, уведомлять смежные команды о планируемом росте рпм, проводить НТ - это приходится.
>>2797701 >Возвращать сам объект из метода [пере]изобрели в jQuery, то есть в жопаскрипте, чтобы можно было нахуячить цепочку Чееееел. Конкретно для стринг билдера этот шаблон с возвратом this использовался и джавой и шарпом, задолго до жс.
>>2797777 Какой же охуенный язык Го! Делаем у метода ебанутую сигнатуру, чтобы она соответствовала какому-то интерфейсу в другом пакете. При этом в коде вообще никаких упоминаний об этом интерфейсе. Ну заебись же!
>>2798594 Если разработчик хочет чтобы тип реализовывал какой-то интерфейс - пусть явно это напишет. А не ебется с var _ Interface = &Struct{} и пользователям мозги не ебет а прокатит Foo в качестве Bar?
Нахуй надо тащить duck typing в статический язык - решительно непонятно. Это порождает кучу сложностей в рантайме, типа >>2789881часть про то как тип мапиться на интерфейс в рантайме, это создает проблемы с пониманием API нахуй надо a nil error возвращать?. Оставте duck typing динамодристне, а в статическом языке делайте статические реализации интерфейсов.
Как скомпилировать go-программму без подключённого интернета?
Будучи на даче, обнаружилось, что go build без интернета совсем не работает (выдаёт ошибки подключения к сети). То есть ни одну программу невозможно собрать оффлайн. И это несмотря на то, что все зависимости уже установлены и есть в кэше.
Завезли функций, гуляем Go 1.21 adds three new built-ins to the language.
The new functions min and max compute the smallest (or largest, for max) value of a fixed number of given arguments. See the language spec for details. The new function clear deletes all elements from a map or zeroes all elements of a slice. See the language spec for details.
>>2799466 >И это несмотря на то, что все зависимости уже установлены и есть в кэше. ты уверен, что они все правильных коммитов, которые у тебя в go.sum?
>>2799680 >The new functions min and max compute the smallest (or largest, for max) value of a fixed number of given arguments. See the language spec for details. Был бы нормальный язык math.Max() был бы перегружен для всех числовых типов. Но это не говновей. Говей это делать встроенные функции, когда проблема уж совсем заебывает. Интересно что им мешало переписать math.Max() на дженериках? Пока не научились ими пользоваться?
1) Вначале с включённым интернетом компилируем вот такой hello.go https://pastebin.com/96uYkp4P Он соберётся, при этом все зависимости скачаются автоматически. 2) Теперь отрубаем интернет, создаём новый каталог, в который помещаем только hello.go, и пробуем его собрать. Невозможно, так как лезет в сеть и не может приконнектиться: exit status 128: fatal: unable to access 'https://github.com/mattn/go-runewidth/': Could not resolve host: github.com fatal: unable to access 'https://github.com/nsf/termbox-go/': Could not resolve host: github.com
А go mod vendor выдаёт:
github.com/mattn/go-runewidth: no required module provides package github.com/mattn/go-runewidth; to add it: go get github.com/mattn/go-runewidth github.com/nsf/termbox-go: no required module provides package github.com/nsf/termbox-go; to add it: go get github.com/nsf/termbox-go
Что за дебилизм? Смотрите первый пункт, зависимости-то уже скачаны и в кэше! А без сети go get уже и не сделать!
>>2800415 >Отправляешь туда разные типы и comparable интерфейса, твои действия? Ты вообще программировать то умеешь? https://go.dev/play/p/z0DI3dyeWJtесли бы был встроенный тип ordered было бы компактней
И не comparable, а ordered. comparable это только равенство, но не порядок.
>>2800645 Гениально! А зачем вообще было создавать отдельный каталог и помещать туда hello.go, если можно было остаться в том же? Даже перекомпилировать не надо, бинарник-то уже собран! Это был пример для гарантированного воспроизведения, дурында!
Для тупых: в реальности вместо hello.go может быть другая прога, хотя и включающая те же зависимости (+ другие тоже уже скачанные), но для которой нет готовых go.mod|sum.
>>2800728 чел, там всего лишь надо в go.mod указать версии пакетов и оно всё из кеша подтянется. можешь хоть из нескольких разных go.mod накопипастить реквайры. почему тебе go mod tidy не заполняет go.mod последними локальными версиями? ну типа да, могли бы заполнять, но вообще юзкейс редкий и всем похуй. можешь на гитхабе предложить.
>>2801052 Не соглашусь. Есть множество случаев, когда может понадобиться скомпилировать программу без интернета.
Кстати, go нужно банить на хостингах за такое насилование сети на каждый чих вместо кэша. Ладно, сейчас на go мало кто пишет и компилит, а если он вдруг станет по-настоящему популярным? Это же ддос-атака на ресурсы типа гитхаба и бессмысленный жор кучи трафика.
>>2801108 >Есть множество случаев, когда может понадобиться скомпилировать программу без интернета И у тебя есть все зависимости для этого в локальном кеше И эту программу тебе поставили без go.mod И ничего в ней не завендорили
Не понимаю прикол таких вещей как go kit и go micro. Пытался выкурить, но так и не понял, в чем прикол. Антон, расскажи, юзаешь ли ты это и для чего?
Еще через жопу у меня получается трейсить запросы, и особенно логировать trace ID и span id. Антон, расскажи, юзаете ли вы трейсинг и так ли он необходим
>>2801521 Ты видимо с кубером ещё не работал, раз такие вопросы задаёшь. В гошке вся фишка в том, что ты не только бэк пишешь, но ещё и девопсом на 0.75 ставки будешь работать. Морально готовься.
>>2801521 не юзаю. ну go-kit где-то там глубоко в зависимостях видел. тулинг-логирование-трейсы-метрики-хуемое у нас отдельная команда делает - частично самописные вещи, частично обертки под уже готовые (потом там что-то допиливает/меняет реализацию под капотом и т.п.). мы просто юзаем то что они предоставляют. трейсинг юзаю, т.к. у нас дохуя сервисов и чтобы понять что вообще происходит при вызове какой-то ручки это быстрее, чем лазить по коду нескольких реп.
>>2802673 Че ты расквакалась пидорашка зумерская? Нахуй тебе это скобка после выражения? Байты экономишь? Такой код стайл самый адекватный, сразу +100 к читаемости потому что всё четко видно по блокам и что к чему относится. Жаль что зумерки этого не понимают, ведь они ничего кроме кода своих лаб не видели даже
>>2797540 Но форсить его на уровне компилятора, догадалась только в го. Если уж так руки чешутся, то сделали бы в релиз режиме. А то дебажишь код, закомментировал строчку, и переменная не используется иди нахуй.
>>2802808 Майкрософтомакака, ты? У тебя мозгов не хватает распознать блок, который начинается не скобкой, а ключевым словом? Я хочу видеть максимальное количество строк кода за раз чтобы не скролить постоянно его туда-сюда. Люблю смотреть как вы пролистываете ваш код с сеттерами и геттерами из одной строки, который превращаются в ёбаную гармошку на весь экран из-за скобок. Другой анон.
>>2803469 А почему 3, магический ты человек? Бери выше, любая параша лучше вашего говна где программисту даже кодстайл выбрать нельзя. Странно еще что вам на нем писать разрешают
>>2803619 >программисту даже кодстайл выбрать нельзя программисту вообще нахуй лишнего выбора нельзя давать. пусть пишет то, что нужно, а не всякой левой хуйней занимается.
>>2770750 Может кто-то пояснить за эту хуйню? Я так понял, что прикол в том, что просто хочется делать встроенные в язык итераторы, а если делать их тупо на каналах без поддержки yield'ов то это будет неэффективно
>>2803794 >База. Как вообще код этих пидарасов ревьюить, если у них ещё и кодстайл отличаться будет. Как во всех нормальных языках делают. Компания выбирает себе кодстайл, пишеи гайдлайны, в CI/CD вставляет запуск верифаера кодстайла. Если компании похй - то все пишут как хотят. Уж точно это не Пайково собачье дело.
>>2802808 Шарпомакака, только у вас так по ебнутому переносят скобки, потому что индусам в ms построчно платят. Во всех других языках code style примерно как в гошке и линтеры работают примерно также
>>2805411 >ну если ты под словом кодстайл понимаешь синтаксис то вопросов нет, намыль веревку и скворечник свой повесь Дебил, весь мир по кодстайлом понимает в том числе и расстановку скобок. Иди лучше в мак сортиры мыть.
>>2797800 Авито-анон, поясни, плс, за направления в авито для гошников?, какие перспективные, какие интересные. Видел вакансии в области безопасности в том числе, там интересные проекты? Или самый движ в продуктовой разработке?
>>2806676 челик, кодстайл это всё то, что ты можешь менять. спек языка это не кодстайл. синтаксис языка это не кодстайл. реализация компилятора это не кодстайл.
Пытаюсь собрать бинариник под андроид телефон. Установил GOOS=android и GOARCH=arm Пыфтаюсь собрать и получаю # runtime/cgo gcc.exe: error: unrecognized command-line option '-marm'; did you mean '-mabm'?
В GOGCCFLAGS при этом вижу этот -marm но GOGCCFLAGS не меняется по документации. Так как изменить параметр для компилятора? Это делается на стороне Go, на стороне gcc, надо менять какой-то другой параметр?
Где можно почитать про рантайм го? Желательно по последним версиям и чтобы в одной статье все аспекты были рассмотрены хотя бы поверхностно планировщик, gc, структура памяти, etc.
>>2806716 >челик, кодстайл это всё то, что ты можешь менять. спек языка это не кодстайл. синтаксис языка это не кодстайл. реализация компилятора это не кодстайл. Мне ебучий компилятор не дает спокойно строчку закоментировать, отказывается компилировать потому что переменная/пакет не используется. Хорошо хоть переменные пока дают называть как хочешь. Но чувствую это поправят в новом релизе.
>>2806678 я в продукте, насчет безопасников не очень много слышно - обычно то, что они sast/dastы пилят, ну и с аудитами помогают. максимум движа - в продукте, там всякие аб-тесты, новые запуски и т.п. но я думаю в командах со внутренними продуктами тоже полно интересных задач. энивей можно трансфернуться в другую команду, если поймешь, что тебе не очень и там будет вакуха.
>>2807472 После возврата из функции стекфрейм считается неиспользуемым, дальше возможны варианты. В Го стек горутин выделяется на куче, после завершения горутины память могут вернуть ОС, тогда будет сегфолт в текущей реализации, Го никогда не возвращает память ОС. В стек может записать новый вызов функции, сегфолта не будет, но вместо данны будет мусор наиболее вероятный сценарий.
>>2806965 Отличный вопрос, рекомендую почитать нигде, ещё можно нигде и в конце обычно всем советуют нигде. Дельных статей почти нет, на русском просто нет, читай исходники, слушай подкасты гошников, они иногда этой темы касаются. Смотри видосы с конференций по теме, но там зачастую джуниор уровень.
>>2797528 Golang - буквально язык программирования Google. Он разрабатывался для решения внутренних задач, и, очевидно, был написан под местный кодстайл.
>>2808054 >Golang - буквально язык программирования Google. Он разрабатывался для решения внутренних задач, и, очевидно, был написан под местный кодстайл. В Гугле половина вопросов по кодстайлу решается presubmit check, но другую засунули аж в компилятор. Почему нельзя было всё так сделать?
>>2808054 Это очень популярный миф, а точнее пиздеж. Вклад гугла в го там на уровне "мы платили деньги чувакам типа Раса Кокса, которые фулл тайм разрабатывают ЯПы". Целей сделать "язык гугла" у них не было и нет. Хуйня про "нам нужен был язык для дебилов" и прочее тоже очень сильно вырвана из контекста и слов одного конкретного человека. Более того, ты можешь пойти к любому сотруднику гугла и спросить, как там у них дела и они тебе ответят, что с го у них пиздец и дикий говнокод. И да, половина гугла написана на джаве, половина на плюсах - а оставшиеся проценты делят все прочие языки, включая го. Даже убер, насколько бы он мне не нравился - намного более "гошная" контора, которая написала тонну софта и которая действительно в промышленных масштабах разрабатывает и поддерживает сервисы на го. хотя их код конечно ну такое, там явно джава головного мозга, не советую
>>2808801 >Вклад гугла в го там на уровне "мы платили деньги чувакам типа Раса Кокса, которые фулл тайм разрабатывают ЯПы". Кто девушку ужинает, тот её и танцует. Да Го не внутренний язык Гугла, но он очень сильно заточен под нужды SRE.
>ты можешь пойти к любому сотруднику гугла и спросить, как там у них дела и они тебе ответят, что с го у них пиздец и дикий говнокод. Код сам по себе нормально написан, проблема в том что постоянно меняются приоритеты. Система писалась для одной задачи, пришло начальство и сказало, что теперь ваша система будет ещё и задачу Б делать, срок вам квартал. Понятно, что архитектура получается не очень. Но сам код нормальный насколько возможно для го.
Зип файл, православные. Расскажите, как дела у вас на работах? Я три года андроид и с недавних пор котлин мультиплатформа разраб. Заебался что постоянно всё новое, постоянно надо чёто новое дрочить, что в каждой конторе своя выдуманная архитектура потому что архитектура, рекомендуемая гуглом, говно, и постоянно обновляется. Три многопоточных "фреймворка", два UI-фреймоврка ничем не похожих друг на друга, два языка, jvm и native, дохуя делов короче, больше не хочу этим говном заниматься. В каждой вакансии свой уникальный стек, а я не очень умный чтобы меня на любую из них брали без специфичных знаний. Расскажите, насколько у вас всё устаканилось, чё вообще на работе делаете? Может кто из андроида/мобильного перекатился, расскажите про свой опыт. Стоит ли перекатываться или лучше не выёбываться и торчать в android/kmp?
>>2809541 Добавлю, что работаю в говноконторе без тестировщиков, аналитиков и прочих. Делаю приложения для железа по BLE, USB, MIDI. Всё нетипичное, может поэтому я здесь так страдаю, не знаю.
>>2809541 100% инфу не дам, т.к. сам пока пытаюсь свичнуться, из опыта собесов и прошлого опыта в энтерпрайзе могу сопоставить, в целом кажется +- один и тот же стек, во многих солидных конторах над конкретными технологиями свои обертки, если будешь писать микросервисы, а скорее всего так и будет, то там все же по шаблонам из шапки, на уровне самого приложения - чистая или гексогональная архитектура, ну UI не будет скорее всего, только если ты не фулл стек. SQL надо надрочить и понимать как БД работают. В целом шарить за бэк полезно, подходы не так чтобы меняются часто, типа пакетной обработки, брокеров сообщений, протоколов https, grpc.
>>2809489 > Но сам код нормальный насколько возможно для го. Да нихуя он там у них не нормальный, идиоматичностью и не пахнет. Нормально писать на го, нужно идти не в гугл, суровая правда жизни
>>2809286 Это в лучшем случае лучшее из худшего. Куча магии, неочевидного поведения и хаков, чтобы эмулировать нормальные джавовые контейнеры. Для го такой подход чужд. Но даже если и забыть про всё это - fx тупо плохо написан, я разбирался в их коде в своё время. Это крайне переусложненная надстройка над dig, с абстрактным графом абстрактных опций поверх абстрактного графа абстрактных опций. Авторов явно долго и методично били по голове самоучителем по Java 8. А потом ещё немного повозили лицом по какому-нибудь ООПшному сборнику типа паттернов GOF.
>>2810033 >Да нихуя он там у них не нормальный, идиоматичностью и не пахнет. Нормально писать на го, нужно идти не в гугл, суровая правда жизни Ты там работаешь, чтобы так категорично утверждать? Может приведешь пару примеров не идеоматичного кода и гайдлайнов гугла?
Почему когда я вывожу в консоль, buffer.String() выдает последнюю строку и все круто (пик1). Но когда я делаю похожую штуку и вывожу её в html, я получаю говно, весь вывод идет в одну строку (пик3). Я пытался написать \n в буфер или writer, не робит. Как это фиксить? пик4 функция хендлера
Можете кто-нибудь скинуть ссылку на какой-нибудь гит с небольшой программой на go, но выполненной по всем правилам заебатого кода, про которую сразу можно сказать что чувак шарит?
Бля, я для вката в это ваше программирование выбрал c++. А мне приятель говорил: "фу, старьё, выбирай модное - молодежное". Сейчас пытаюсь изучить GO, чтоб какую-то первую работу найти. Это просто пизда:
1) учебники либо для опытных программистов, либо для школьников. Этого вашего ебучего Донована можно с середины в любом направлении читать, пытался учиться по нему - упражнения в каждой главе как будто ты уже всю книгу осилил, периодически на середине какой-то темы бросается выражениями, которые не программист не поймет. С трудом понимаю что пишет, проводя параллели с c++, плюнул изучаю язык по хуйне для школьников. Базовой инфы никакой, пишет для тех, кто уже имеет опыт в пару лет как минимум. 2) ебусь второй день с ебучими пакетами, не могу заставить GO пользоваться моими пакетами из нужных мне папок. Какого хуя, спрашивается, вообще нужен был этот ебучий гемморой с GOPATH, примеры из учебников не работают, примеры из стаковерфлоу не работают, добрался до Go Modules, про который какая-то добрая душа где-то написала. Предчувствую ещё пару вёдер этого дерьма. 3) Онли пакеты с функциями и готовыми объектами. Я понимаю что макак типа меня надо снабжать готовыми решениями, чтобы сложнее было хуйни наворотить. Но в крестах я понимал что стоит за каждым объектом, за каждой функцией или хотя б в общем виде представлял. А тут набор кроликов из чёрных ящиков, вот тебе возвращаемые значения, а остальное тебя ебать не должно. Логика тут есть, только чувствуешь себя на тонком льду - не знаешь когда и где провалишься. А когда это таки случается - не понимаешь с чем это связано, как это исправлять и где вообще концы искать.
Короче я не понимаю что простого в GO, в крестах много информации, но всё гораздо проще и прозрачней. Баттхёрт излил - пойду дальше жрать кактус.
>>2811386 а поделишься ссылкой на Донавана или где купить pdf? >добрался до Go Modules ну там проще, пакетики загрузятся в нужную папку >Онли пакеты с функциями и готовыми объектами. юзай чатгопоту, он неплохо разжевывает моменты и экономит время на гугле, но чекай на всякий потом его ответы
>>2811386 > учебники либо для опытных программистов, либо для школьников Учебники всегда непонятные, пока ты не начнёшь проекты делать сам. >А тут набор кроликов из чёрных ящиков, вот тебе возвращаемые значения, а остальное тебя ебать не должно. Ну ващет в го можно хоть в исходники самого компилятора залезть чтобы что-то посмотреть, тем более в исходники пакетов (если ты скачал эти исходники). Это ж не 1с.
Донован есть на рутрекере, я себе еще книжку купил 20-го года издания, правда судя по всему это все то же издание, отличий я, по крайней мере, не заметил.
В итоге ещё несколько часов баттхёрта, гугления, кучи созданных новых проектов и директорий - каким-то образом начало работать. Но знаете, что: 1) я не понимаю почему оно начало работать 2) я не понимаю почему оно не работало Есть подозрение, что изменение произошло после того как я изменил с GO111MODULE = auto на GO111MODULE = on. При этом все старые директории, в которых я инициировал go.mod продолжают не работать. Короче, говна поел, потратил время в пустую, даже не разобрался.
>>2811581 >Есть подозрение, что изменение произошло после того как я изменил с GO111MODULE = auto на GO111MODULE = on ну это проверяется за 10 секунд. у тебя какая версия? >Go 1.17 was released on August 16, 2021. As for 1.16, GO111MODULE=on is the default behavior, and GO111MODULE=auto is equivalent to GO111MODULE=on. If you still want to use the GOPATH way, you will have to force Go not to use the Go Modules feature using GO111MODULE=off
>>2811386 Это какой-то троллинг. Кресты невозможно выучить и практически невозможно писать на них правильно, спроси у любого достаточно опытного программиста, не являющегося при этом фанатиком. Кресты охренительно сложны даже на уровне стандартов, а ещё там на каждом шагу UB (гугли UBook, охуеешь оттого, насколько небезопасно в крестах делать что угодно) и ансейф на уровне стандартных библиотек. Не от хорошей жизни появился раст, не от хорошей жизни появился го.
Я не буду спорить, потому что я сраный вкатун, а не программист. Возможно это заслуга хорошего учебника, я осваивал кресты по книге Стивена Пратта "Язык программирования C++". Каждый рассмотренный вопрос в этой книге мне понятен. Больше всего сложностей у меня было с указателями, а точнее когда начинались указатели на указатели на указатели, но даже это далось. Также мне лично относительно тяжело было понять обобщенное программирование из библиотеки STL после ООП. Абстрактные классы, виртуальные функции, шаблоны всех мастей, спецификации и другие вещи с иерархиями следуют определённым строгим внутренним правилам, поэтому всегда можно раскрутить весь клубок и прикинуть хуй к носу. Этим мне С++ и понравился - он пронизан определёнными глобальными принципами, которые дают тебе правильное направление в мышлении, либо просто автор учебника настолько хороший преподаватель. С тем что C++ более чувствителен к качеству программиста - я полностью согласен, так как ограничений он накладывает очень немного.
Поэтому мне сейчас Go кажется тяжёлым, так как на первый взгляд он выглядит просто как бессистемный набор каких-то решений.
>>2811386 >>2812443 Поздравляю, ты только что разницу между коммерческим языком и пустым дрочем. Никто не читает код библиотек, и уж тем более крестовых кроме самих писателей этих библиотек и задротов-велосипедистов. Занятие абсолютно бессмысленное, во-первых, во-вторых, довольно сложное, потому что код плюсов, особенно stl и boost подобных библиотек - очень нетривиальны, требует не только разбирания логики, но и почему именно так написано а не иначе. В плюсах люди не реализуют свои идеи, они блять сидят и дрочат: а что блять там где то и как будет происходить если я напишу свою мысль вот так или эдак? Это абсолютно идиотское занятие. Но зато ты понимаешь как все происходит вон там, и после, правда что уже после после происходит как то не оч(
>>2812443 Я отчасти с тобой согласен, го действительно несколько бессистемен. В смысле, многие вопросы в нём или отданы на решение самому программисту (то есть, решаются разными либами), или язык содержит для них пару волшебных хаков. Но при этом го сильно проще плюсов на концептуальном уровне, этих концепций на порядки меньше. По сути в го есть структуры, интерфейсы и функции, всё остальное - легкие надстроечки. В плюсах и прочих языках этого сильно больше, а ведь потом ещё и начинаются хаки, хаки хаков, хаки хаков хаков и тп. В результате к примеру в плюсах это приводит к тому, что программирование на языке превращается в метапрограммирование на темплейтах, где без поллитра не разберешся. Про арифметику указателей и триллион тонкостей с ними я вообще молчу. При этом конкретно плюсы страшны тем, что во первых, там до черта вариантов сделать одно и то же немного по разному (какая-нибудь разница между string_view const char* и тп), а во вторых каждый из этих вариантов содержит подводные камни и ловушки, которые ты в своём игрушечном коде и книжках для начинающих не встретишь, а на реальной работе начнешь быстро седеть и охуевать от того, что там из этих подводных камней можно кремль выстроить.
Очень тривиальный(но рабочий) пример:
bool Foo(int a) { return a < a+1; }
в плюсах в реальной жизни будет возвращать тебе неожиданный результат в зависимости от компилятора и его настроек. В условной дебажной сборке результат будет вычисляться примерно так, как ты ожидаешь: на почти всех числах функция вернет true, а на 2147483647 она вернет тебе false, так как a+1 переполнится. И это переполнение это популярный хак, на котором часто строятся программные продукты, ожидаемое поведение. Но! В релизной сборке в компиляторе скорее всего включится оптимизация, которая посмотрит на код и решит, что a всегда меньше, чем a+1 и в итоге в результате компиляции в бинарнике у тебя будет:
bool Foo(int a) { return true; }
А теперь удачи отлавливать баг, которого ты не видишь (зависит от настроек компилятора), который может проявляться только на некоторых устройствах (особенно если ты делаешь кросс компиляцию) и который не повторяется у тебя на дебажной сборке. И ни в каких учебниках ты даже не узнаешь про эту мину (и примерно 2147483646 других мин), пока сам не столкнешься.
Го как раз и разрабатывался с мыслью "нахуй всю магию, всё должно быть всегда очевидно и работать в точности так, как пишется и ожидается". Там таких багов не будет.
Поэтому мой тебе совет, не начинай с плюсов, это прОклятый язык, который с каждым годом становится всё хуже, потому что его продолжают усложнять и вставлять в него новые ловушки.
Если не нравится го - это не проблема, начинай с Java (после 21 версии совсем хорошо должно быть), C#, Kotlin, да хоть Typescript.
О том, что числовые типы при переполнении изменяются циклически говорится то ли во второй, то ли в третьей главе, когда обсуждаются числовые типы. Кстати, GO ведет себя точно так же и в обоих случаях одна и та же простая логика - берется число с адреса где одни единицы, процессор добавляет один, получает число, которое содержит одну единицу и кучу нулей размером как раз с адрес, а по правилам когда число не влезает - отбрасываются старшие порядки, т.е. единственная единица. Это условность не языка программирования, а данных в компьютере.
Ну я не буду спорить, потому что не обладаю ни нужным опытом, ним сформированным мнением.
>В релизной сборке в компиляторе скорее всего включится оптимизация, которая посмотрит на код и решит, что a всегда меньше, чем a+1 и в итоге в результате компиляции в бинарнике у тебя будет:
Давай посмотрим с другой стороны: зачем тебе проверять а+1>а в принципе? Математически это всегда верно, но твоя проверка может быть только проверкой на переполнение. И вот какого-то хрена твоя проверка не работает. Для того чтобы знать о том что компилятор заменит твое выражения просто true надо знать и о свойствах численных типов и о свойствах компилятора, а для того чтобы не совершить ошибку тебе надо знать только о свойствах численных типов. Ты выбрал плохой пример.
>>2813046 Это был специально упрощенный пример для дискусси, призванный проиллюстрировать, какие вообще бывают ловушки. За более сложными велкам ту https://github.com/Nekrolm/ubbook , выбирай любую и охуевай
>>2812646 Суть не в том, что они переполняются, а в том, что компилятор перехерачит твой код очень своеобразным образом, на чем кстати основана львиная доля хаков и ещё большая доля багов. Захочешь работать плюсовиком - готовься без шуток посвятить всю жизнь борьбе с особенностями компиляторов.
Я тут откликался на всякие вакансии и вот мне прислали тестовое на Go. Я ниразу даже не читал про него (в вакансии было указано, что типа нужен опыт программирования на любом языке, поэтому и откликнулся), поизучал тут недельку и вроде работает, но конечно сомневаюсь чет. Можете глянуть плз, есть ли какие-то критичные косяки? https://github.com/Ivansergee/medods-test
>>2813794 круто, что всё в main поместилось, но 100% у ревьюеров будет вопрос будешь ли ты весь код в main.go писать в реальных проектах. раздели хотя бы на хендлеры/репозиторий. плюс юнит-тестов нет - с разделением ты сможешь хотя бы на моках протестить хендлеры. интеграционные тесты для репы тоже неплохо бы иметь, но честно говоря хз как там на гитхабе монгу поднимать в CI
>>2814172 Я переделал, теперь получше? Не очень понял про этот репозиторий конечно. Я сделал просто пакет database и сложил туда все операции с бд в общем. Надо ещё пакет создать типа model и туда сложить структуру User? Я прост подумал ну там 2 сточки всего, ладно пусть там с логикой для бд полежит :)
глобальная переменная с БД выглядит странно. я бы положил в структуру, методами которой были бы хендлеры. пакет utils считают антипаттерном, его можно назвать tokens. юнит-тестов всё еще нет. хотя бы на токены можно сделать. GetUser/UpdateUser по-хорошему должны контекст на вход принимать первым аргументом.
>>2814832 Ну лан, спасибо. Почитал про utils, переименую) Мне уже сдавать надо прост. Тесты там же не говорили писать)) постоянно нихера не тестирую в своих работах, потом жопа подгорает конеш
Ну и чего делать? OpenAPI говорит что date-time должно быть с таймзоной, api считает, что "ну не обязательно". Патчить спеку ну такое себе, патчить _gen.go - no way. Что остается?
Народ, слыште. Короче я PHP даун, на работе грят учить го, будем перехуячивать микрописюны. Как по быстрому выучить го? Сегодня начал писать сам себе сервис для сокращения ссылок. Ну типа как знаете, для отправления уведомлений на мобилку.
Но там не особо вижу где применять гошную хуйню вроде sync. Так же, у вас блять фреймворки есть сука? Я попробовал gin, хуйня какая-то ебучая. Стал тупо гориллу юзать для роутинга
>>2815994 >Стал тупо гориллу юзать для роутинга молодец >Но там не особо вижу где применять гошную хуйню вроде sync ну смотри. вейтгруппы - для параллельных сетевых запросов, например в соседние сервисы. мутексы - если ты там ну например кешируеш в памяти што-то к чему может идти параллельные чтения и запись. для микроговна это по большому счету все юзкейсы.
Задача: Написать программу, которая использует две горутины, которые выводят числа от 1 до 100 поочередно
Вопрос: Гарантируется ли, что в такой реалзиации (пикрил) мы прочитаем число из второй горутины, отправляя его из 1й? Может ли быть так, что мы начнем читать из канала в горутине, которая пишет в этот же канал?
>>2816366 > Может ли быть так, что мы начнем читать из канала в горутине, которая пишет в этот же канал? Канал не буферизованный, значит чтение и запись блокирующие, т.е. горутина не может читать и писать в канал в цикле - будет дедлок >Гарантируется ли, что в такой реалзиации (пикрил) мы прочитаем число из второй горутины Если не буферизованный канал - да. Иначе в теории возможно.
Ну и одна из двух горутин утекает при такой реализации, в прод такое не должно попадать.
>>2816366 > Может ли быть так, что мы начнем читать из канала в горутине, которая пишет в этот же канал? Канал не буферизованный, значит чтение и запись блокирующие, т.е. горутина не может читать и писать в канал в цикле - будет дедлок >Гарантируется ли, что в такой реалзиации (пикрил) мы прочитаем число из второй горутины Если не буферизованный канал - да. Иначе в теории возможно.
Ну и одна из двух горутин утекает при такой реализации, в прод такое не должно попадать.
Го используется где-нибудь помимо веба? А то это мой первый язык програмирования (хотя вторым и третьим щупал сишарп с жаваскриптом) и думаю есть ли альтернативы для вката.
>>2817730 Выбор у тебя между бэкендом и бэкендом. Бэкенд для вебсайтов, бэкенд для энтерпрайзной приложухи. Смежно можешь ДевОпс посмотреть, но для этого бэкенд опыт все равно нужен.
>>2817730 >Го используется где-нибудь помимо веба? Я видел прикольный iot фреймворк на go https://gobot.io/ Можно писать drone.Event("flying"), gobot.After(3⋆time.Second, func() { drone.Land() } ну и подобное. Думаю вполне под iot и умные дома подойдёт.
Задача: Основное преобразование указателей: Напишите функцию, которая принимает целое число, использует пакет unsafe для преобразования его в указатель, а затем обратно преобразует его в целое число.
Нейронка на пикрил1 решение ответила следующим: "В основной функции вы определяете целое число a, а затем передаете его функциям BackAndFourthUnsafe и BackAndFourthUnsafe2. Эти функции пытаются преобразовать указатель на num обратно в целое число. Однако, поскольку num является локальной переменной внутри основной функции, к моменту попытки разыменования его указателя он может выйти за пределы области видимости." И предлагает пикрил2
Мое мнение по этому поводу: "Не вижу в чем мой код создает "undefined condition". Во втором случае значение num копируется в функцию, затем мы получаем указатель на это значение в стеке (поскольку мы находимся внутри функции), сохраняем его внутри переменной. Далее мы разыменовываем значение, копируем его значение в b и возвращаем b."
Вопрос: Правильно ли я решил задачу? Где прочитать про то, что высрал чатгпт, потому что я что-то такое слышал в лекции по unsafe про то, что сборщик мусора удаляет ненужные вещи при неправильной работе с Pointer, , но ничего так и не понял
>>2818807 >В реальном мире бывает вообще только десятки неструктурированных методов без единого формата ответа Ну так не работайте в говноконторах.
У нас все через gRPC, один раз задекларировал протокол и потом под любой язык можно сгенерировать клиент и сервер. Да можно все и с помощью OpenAPI делать, но у реста хуже возможности, хуже производительность, хуже производительность сериализации/десериализации. Из плюсов - можно дергать прямо из браузера, т.е. один и тот же эндпоинт можно дергать со странички и других сервисов хотя я с трудом представляю себе такой юзкейс.
>>2818632 Не знаток этой камасутры с байтами, но предположу, что в своей реализации, ты берешь адрес локальной переменной backAndFourth функции, т.е. в случае когда локальная переменная не сбегает в кучу (возможно при неправильной работе с Pointer), то при присвоении значения переменной внешней функции указатель уже будет ссылаться не на int.
>>2818632 >к моменту попытки разыменования его указателя он может выйти за пределы области видимости хуйню морозит этот тостер. из функции int возвращается бля, где там разыменование после выхода?
Анончики, а нет тут случайно тех кто в Ката академи учится на курсе Go? Вроде как по отзывам там лютейшее задротство но выходишь спустя ~9 мес прям очень крепким кандидатом, было бы интересно узнать мнение из первых уст.
>>2819877 Я говорю про рынок в целом, сейчас ты бизнесу не нужен если не начнешь приносить деньги уже на следующий день. Поэтому нахуй нанимать чуваков которые будут тупить пол года год пока во все въедут? Никак не свитчатся
>>2819778 >как вы свитчитесь? Как правило на сеньорные вакансии опыт в конкретном языке уже не играет роли. Я писал на Джаве, меня собесили на Джаве, а когда вышел сказали учить Го а могли сказать учить С++, смотря в какую команду бы попал.
>>2820036 Очень и очень спорная хуйня. Ситуация, когда тебя нанимают на хз какой язык это пиздец и нормальные конторы таким не занимаются.
Как правило вариантов развития событий два: 1) Тебя сразу нанимают как сеньора в конкретном стеке, скажем в компании основной стек это джава и тогда тебя нанимают как сениор джависта, ожидая, что ты очень хорошо шаришь за jvm, инфраструктуру, бест практисы, экосистему и так далее. Этот вариант самый распространенный и самый же нормальный, потому что будь ты хоть уберсеньором на другом стеке, тонкости ты быстро не выучишь и к ним не приноровишься и первое время будешь на уровне условного миддла. 2) Тебя нанимают в первую очередь как сильного специалиста и готовы заливать тебя деньгами, пока ты не научишься чему они там хотят. Так делают всякие бигтехи типа убера, амазона и прочих. Но даже там тебя не кидают хз куда, в конце процесса найма тебя собесят уже в конкретные команды и на этапе оффера тебе предложат одну или несколько команд. У меня так друг-бекендер пошел писать мобилки за x4 зп.
>>2820130 >Тебя сразу нанимают как сеньора в конкретном стеке Бизнес иногда переписывает весь свой код с языка Х на язык Y, по разным причинам. Найти сеньора в двух этих языках на рынке труда мало вероятно, проще нанять сеньку в одном из них и доучить на месте.
>>2820108 Да ты сам стяни ебало, сеньер помойный. 10 лет тягал джейсоны и тут ему дали задание "плюсы изучи", ты как себе это представляешь чмоха сельская? Ты кто вообще? Выпускник мита в фаанге или че? Смех да и только блять
>>2820136 В этом случае тебя будут нанимать или как сеньора(миддла) в языке X, или в языке Y. Нанимать сеньоров на полную ставку на язык, в котором они не разбираются - это абсолютное расточительство, потому что платить им нужно по сеньорски сразу, сеньорами в новом стеке они станут потом. Глупо с этим спорить.
>>2820130 >Ситуация, когда тебя нанимают на хз какой язык это пиздец и нормальные конторы таким не занимаются. Гугл и Амазон вообще не указывают язык, Майки указывают просто список типичных языков даже Джава там есть.
>Тебя нанимают в первую очередь как сильного специалиста и готовы заливать тебя деньгами, пока ты не научишься чему они там хотят. Так делают всякие бигтехи типа убера, амазона и прочих. Не только, вот например https://careers.hellofresh.com/global/en/job/5010175/Principal-Software-Engineer-m-f-x как видишь там несколько языков. И по опыту общения с ними, могу сказать что знание только джавы им тоже ок.
>Но даже там тебя не кидают хз куда, в конце процесса найма тебя собесят уже в конкретные команды и на этапе оффера тебе предложат одну или несколько команд. Не совсем так. На момент собеседования твоя команда еще не ясна, она будет ясна на момент оффера. У нас вообще несколько языков используется, основной Го, но есть части на Джаве и Питоне.
>>2820329 >вообще мне не противоречит А кто писал >Так делают всякие бигтехи типа убера, амазона и прочих. не ты? Или ты будешь заявлять что HelloFresh это бигтех?
>и при этом я специально написал "в конце процесса найма тебя собесят уже в конкретные команды" Нет, не собесят тебя в конкретные команды. Хайринг комити решает в какую команду тебя звать, никаких дополнительных собесов с командой - нет.
>На двачах смотрю ничего не меняется, люди как не умели читать дальше первого слова в предложении, так и не научились Дурак, ты сам в контекст не можешь, а на других киваешь.
>>2819778 Пытаюсь свичнуться с начала августа, за все время получил один оффер и 3 приглашения на собес, сейчас подвис второй. Опыта прямо разработки около 7 лет на разных стеках, последние 3 года энтерпрайз микросервисы на джаве. HR сами пишут из крупняков, VK, Ozon, Avito, Yandex. От мелких контор 95% отказов, либо просто смотрят резюме. Видимо кто имеет возможность пылесосить рынок и расширяется, те заинтересованы. Написал пару простеньких петов + решение тестового задания выложил на гитхаб. Что характерно гитхаб никто ни разу не смотрел, хотя ссылка на него и в профиле и в резюме на ХХ. Лето - обычно тухлый сезон, в отпусках многие. Если около джуниор, то как вариант попробуй стажировки от крупняков, их обычно в конце лета открывают, чтобы затянуть студентоту, но возрастного ценза как такого нет. Мне кажется вариант свичнуться есть, но на активный поиск может уйти пара месяцев. А так разве что крупняки - единственный вариант, у них обычно несколько этапов отбора на которых отсекаются те, кто просто го-тур прошел, могут себе позволить размеряно перебирать.
Как эффективно управлять отменой функции из-за истечения времени ожидания, не сталкиваясь с оставшимися горутинами?
У меня возникла проблема с следующим фрагментом кода, который иллюстрирует проблему. В этом сценарии я делаю 100 попыток получить определенное значение, и каждая попытка занимает значительное количество времени (50 секунд). В результате заданное время ожидания в 5 секунд начинает играть роль тайм-аута. Несмотря на то, что горутины GetSomething завершаются в пределах 5-секундного тайм-аута, горутины doGetSomething остаются в памяти в течение всего 50 секунд. Как я могу решить эту ситуацию и предотвратить продолжение работы горутин doGetSomething после их предполагаемого времени отмены?
>>2821765 Тебе нужно в ней обрабатывать контекст. В случае с таймером можно заменить time.Sleep на time.After и делать select по таймеру и по контекст.done. В реальном коде уже смотри по обстоятельствам
>>2821783 >>2821780 Хочу, чтобы был GoroutineKill, а не for цикл с проверкой <-time.After или <-context.Done. Я просто не понимаю, почему так охуенно придумано, что я должен 150 раз проверять, если ли смысл горутине жить, вместо того, чтобы просто ебнуть её, когда она не нужна
>>2821818 >Я просто не понимаю, почему так охуенно придумано, что я должен 150 раз проверять, если ли смысл горутине жить, вместо того, чтобы просто ебнуть её, когда она не нужна Потому что убийство горутины не даёт ей корректно завершить работу. Это у тебя горутина ничего полезного не делает и её можно убить. А в реальном коде могут быть открыты файлы, сеть, базы данных и их надо корректно закрыть. Горутина может держать блокировку и надо её освободить. В конце концов надо что бы горутина была в сейфпоинте иначе могут быть проблемы с памятью.
>>2821866 tl;dr: дрочи литкод Изучи базовые структуры данных и сложности основных алгоритмов над ними: массив, связный список, хэшмапа, бинарное дерево поиска, куча, стек, очередь. Из книг рекомендую "Алгоритмы на Java" Седжвика, на курсере есть курс по материалам книжки, записанный автором. Возьми премиум на литкоде и начни решать easy задачи по базовым структурам. С премиумом у тебя будет возможность посмотреть разжеваное решение, хотя годные с объяснениями встречаются и среди решений других пользователей. Плюс литкода в том, что там иногда приводятся техники решения задач, которые не в каждом учебнике описаны - запоминай их. Когда освоишься с изи, переходи на медиум, порешаешь задачи на динамическое программирование жадные алгоритмы, научишься комбинировать разные приемы работы с базовыми структурами в одной задаче, Этого должно хватить даже для ФААНГА.
>>2821979 Как ты себе это представляешь? Для планировщика горутины это черные ящики, которые находятся в некотором состоянии или намереваются перейти в одно из этих состояний, он оперирует ими исходя из этих состояний. Планировщик не знает, что именно делает горутина и можно ли ее прихлопнуть не дожидаясь завершения. Горутины завершаются сами собой или прерываются паникой.
>>2821979 >А почему нельзя тогда планировщику сказать, чтобы он снял блокировки и её разъебал, он же их там паркует, создает, убивает и тд. ? Потому что блокировка это не какая-то сущность рантайме, а просто тип который реализует некий функционал. Или вообще блокировка в другом месте, например ты создал WaitGroup(5), запустил 5 горутин и делаешь Wait(), а горутины должны вызвать Done(). Или ты вообще дохуя умный и написал свой спинлок. Или как по твоему планировщик должен понять, что надо конект к базе закрыть?
В джаве у класса Thread был метод stop() но его отключили именно из-за того что нельзя безопасно освобождать ресурсы. В C# аналогичный метод тоже задеприкейтили.
Я тут писал раньше >>2813794 Они вот сейчас посмотрели задание и написали, что я иду нахер по причине "Для обновления токенов не нужен токен доступа, что делает выдачу access токена бессмысленным." Вы не могли бы пояснить, а то я не понял, что не так сделано, мне прост интересно. Типа нужно access проверять для рефреша тоже?
>>2824210 Возможно, имеют в виду, что нужно передавать пару accessToken + refreshToken для рефреша. В условии задания сказано, что access и refresh токены обоюдно связаны. Т.е. нужно как-то эту связь на беке проверить, например использовать accessToken как "соль" для вычисления хэша рефреш токена, который ты в БД сохраняешь в привязке к юзеру. Тогда, при рефреше будет условно гарантировано, что пара токенов из запроса принадлежит конкретной сессии пользователя. Но это как-то все равно не повышает секурности, т.к. скорее всего спиздят оба токена, если есть риски на клиенте или соединение дырявое. Например у того же реддита для рефреша нужен только рефреш токен https://github.com/reddit-archive/reddit/wiki/OAuth2 Возможно, оба токена в БД хранят, лол.
>>2740805 (OP) Подскажите лучшие практики по написанию микросервиса под прод. Gin + Gorm всё ещё торт? Ну и чтобы поменьше ёбли было с тестами, есть ли какое-то фримворк или всё ещё руками пишете? Обязательная поддержка .env файликом, чтобы была среда .env.test .env.local .env.prod(stage) итд итп
Раньше вот как-то писали директории /project/cmd/api/main.go, какая сейчас структура проекта?
>>2825417 >Но это как-то все равно не повышает секурности, т.к. скорее всего спиздят оба токена, если есть риски на клиенте или соединение дырявое. Это может повысить секурность, если рефреш лежит в отдельном сервисе рефреша токенов. И когда у основного приложения протухает аксес токенов, оно идёт в сервис рефреша с протухшим токеном, и тогда рефреш уже с двумя токенами рефрешит аксес. Таким образом ни один сервис не хранит у себя 2 токена и злоумышленнику надо спиздить 2 базы.
>>2824210 Что-то ребята совсем ахуели. Мало того что такие вещи джунам задавать, так ещё и требовать догадываться о таких не явных требованиях. При том что сами т.з. внятно и без грамматических ошибок не могут написать.
>>2826560 в проекте может быть несколько api директорий, хз что ты имеешь в виду. у нас например в /api хранятся ямлы для кодогенерации рестохуйни. а main.go апишки в /cmd/service. я вполне вижу, что вместо service кто-то называет свой бинарник api, но не представляю кто будет бля ямлы складывать в /cmd/api.
Настолько зашкварно в голанке использовать сущности? /cmd/entities /cmd/repositories
Имхо, DDD для джавадолбаёбов, но как часто меняется коннектор к базе данных? Если я использую тот же Gorm, то зачем создавать репозиторий, если можно круды написать в слое сервиса. Keep it simple
>>2826226 Да лан, там 1к откликов было, ещё и с зарплатой вакансия, офк там будут че-то требовать. Хоть задание прислали и посмотрели даже. обычно прост игнорят.
>>2826567 >/cmd/entities >/cmd/repositories это идёт в /internal или pkg или тупо корень проекта. в /cmd мейн пакеты бинарников сервиса - апиха/кроны/консюмеры очередей. у нас усредненно примерно такая структура проекта
/cmd/service - апиха /cmd/consumer - обработчик очереди /cmd/zalupa_updater - какой-нибудь крон /internal/clients/ - папки с клиентами в другие сервисы /internal/rpc/ - папки с хендлерами апихи /internal/queue/ - папки с хендлерами топиков /internal/repositories/ - репки /internal/services/* - бизнес-логика /internal/models - внутренние модельки сервиса
>Если я использую тот же Gorm, то зачем создавать репозиторий, если можно круды написать в слое сервиса да хоть в хендлере. хз насколько тебе удобно юнит-тесты писать только, если репу не прятать за интерфейс чтобы можно было замокать
>>2822001 А собственно сейчас в норм конторах алгоритмические задачки при устройстве на Go вакансию просят решать на голанге, или можно хоть на питоне ?
>>2827361 На выбор обычно 4-5 языков, которые в компании используются. Можешь проходить на одном из них, если в маркетплейсы, то скорее всего будет пхп, если в финтех, то вместо php java. Но алгосекция возможно вообще на любом разрешат, кроме совсем нишевых. Меня например собеседовал андроиддевелопер, который не знал по сути го, но в целом шарил за алгоритмы и cs.
>>2828551 Ну вот есть у меня в папке cmd файл main.go в нем пишу импорт и ввожу путь к файлу конфига. Точнее когда ввожу cfg := config.MustLoad() то он автоматически указывает путь к файлу config.go но потом прога начинает выебываться как показано выше. Начинаю своими руками вводить путь к config.go - тоже шлет нахуй
>>2829073 Это правда, хитровыебанную бизнес-логику выносят на отдельные сервисы. Там, где всякая ебань делается в две строчки. Ну это пользовательский ввод, там никогда не нужно быстро что-то решать. А так да, на голанге у нас был сервер автобиддеров и балансировщик, который 10 запросов в минуту решает, кек
>>2828887 какая версия go? используй go modules, с ними проблем нет, тебе нужно импортировать пакет, а не отдельный файл import "moduleName/someDir/packageName" Я тонкостей не знаю импорта, просто создаю под каждый пакет одноименную директорию в проекте и оно работает.
>>2829073 Где как. Где-то пишут конкретные высоконагруженные сервисы, где-то всё подряд. Выносят обычно в случае монолитов на каком-нибудь php или пистоне, где основной язык принципиально тормозной. Та же джава или шарпы сами по себе быстрые и ещё и под конкретный профиль нагрузки тюнятся лучше за счет настройки гц и вынос кода с джавы на го действительно целесообразен довольно редко, или когда код очень прожорливый по памяти и jvm тупо стоит многа деняк, или когда очень нужен мгновенный бутстрап сервиса не дожидаясь, пока jvm прогреется. Чаще всего же переписывают просто из-за технического хайпа, программерам нужно решить проблему тормозов и хочется попробовать новый расхайпленный язык и микросервисы, а тех руководство идёт у них на поводу. Для написания бизнес логики го подходит, всяким станным людям из интернета здесь на слово верить не стоит. Логика выглядит многословнее и всё такое, но в целом я за последние несколько лет написания на го всякого особых проблем не встречал, любые паттерны и стратегии в целом программируются. Другой дело что лично я подустал уже от всех этих явных проверок на нил и отсутствия той же функции map() в стандартной библиотеке, хочется чего-то поизящнее. Выбрал бы раст, он почти как го, только не настолько примитивный, так ведь особо не пишет на нём никто бэкенды
На мой взгляд у го несколько странная ниша такого себе "С++ для тупых", с одной стороны оно компилируемое и поэтому работает быстро и недорого, а с другой есть гц и планировщик и не нужно приседать с указателями и программированием на темплейтах как в плюсах. С другой стороны, почему бы и нет, те же Badoo всё очень правильно делают. Наняли 300 пехапешников для того чтобы лепить фичи и 50 гошников, чтобы делать для пехапешников инфраструктурные сервисы.
Вопрос по VS Code. У меня в папке есть много мелких проектов на го. Хотелось бы с ними работать из корневой папки. Но гошный плагин для вс кода начинает выделываться и пишет ошибку пакета main, из-за того, что проект во вложенной папке. Как сделать, чтобы вс код понимал вложенные папки и не писал об ошибке там, где их нет?
>>2829620 ну попробуй разобраться с гошными воркспейсами. может оно просто после go work init в корне заработает. или как вариант вместо открытия родительской директории добавить все подпроекты в вскодовский воркспейс. ну или не ебать мозги и просто сделать всё одним модулем.
>>2829514 почему не оба? ну то есть смотри гошка не то чтобы за дохуя времени учится, а пыха это почти гарантированное трудоустройство где ты будешь благородно поддерживать легаси, которое через 3 года перепишут на го. ты вполне можешь задрочить пыху и выучить основы гошки, которые на собесах могут спросить. и всегда иметь пыху как запасной аэродром, если не пройдешь на стажировку гошнеком.
Вечер в хату. Nix админ 10+ лет стажа. Хотел в девопс перекатится, изучал так неспешно ансиблы, тераформ и вот это всё, как наткнулся на go, и что то он мне неожиданно пиздец как понравился, я такой кайф последний раз чувствовал когда на Си кодил давным давно. Так то я много на чём кодил(ну как кодил, небольшие тулзы для автоматизации админских задач, в основном на питоне или повершеле, что то более менее серьёзное типо модулей ядра или подобного я в институте давным давно на Си писал) но это прям оче понравилось, структуры эти все, обработка ошибок без трай кетчей. И я вот подумал... а что если не в девопсы а в прохрамисты перекатиться? Но, я никогда в кодеры не метил, за свой 15+ летний опыт в ит, мне из языков только Си нравился, но я обьективно оценивая свой мозг понимал, что я не смогу быть програмистом на Си, т.к. я не настолько умный, кернел хакер из меня не выйдет. Чё щя вообще джуны на голанге пишут, орентировочно? Насколько это вообще хуёвая затея и реально ли перекатиться? На деньги впринципе похер, го я в любом случае дальше изучать буду как замену питона для автоматизации админских задач, просто хочется больше опыта получить и узнать язык получше на практических задачах.
>>2830343 >где ты будешь благородно поддерживать легаси, которое через 3 года перепишут на го В голос с этих фантазий. Уж скорее на джаву перепишут, чем на Го, а более вероятно, что всё так и останется на пыхе.
>>2830401 Я не он, но это в целом очень популярный кейс, сначала пишут монолит на php, который приносит деньги и всё такое, а потом в какой-то момент упираются в то, что он хуево написан, там уже есть годичные кольца говнокода, это все медленно, неэффективно и тп и начинают переписывать его на микросервисы, и как правило в пару берут именно го, потому что простой и эффективный и не жрет столько же, сколько джава. Кейсов php->го было уже дофига, озон, лямода, авито, тд и тп. А вот php->джава особенно не помню.
>>2829514 Я, будучи гошником, тем не менее рекомендовал бы идти поначалу в нормальный проект на php, потому что: 1) Рынок на пыхе больше, больше вакансий, легче искать и перебирать; 2) Хз насколько это актуально сейчас, но на пыхе больше аутсорса и раньше было легче найти что-то за $ или как минимум выше локального среднего по рынку, особенно ты не в Москве живешь; 2) Пыха больше склонна к фрейморкам, что является большим подспорьем для новичка, есть миллион гайдов, примеров "как делать", да и в целом ты работаешь и растешь на какой-то архитектуре. В го же, наоборот, фреймворки не любят и каждый проект собирается в соответствии со взглядами конкретного лида (в лучшем случае) или девелопера (в худшем); Поэтому на пыхе тебе будет и легче, и ты приобретешь больше архитектурного опыта и знания паттернов, для новичков это очень полезно; 3) Го это в целом довольно примитивный язык, без негативных коннотаций, просто по факту: в языке очень мало встроенных возможностей, даже дженерики до сих пор каличные; Новичку как правило лучше набраться кругозора и потрогать/посмотреть больше вещей и здесь какие-то более богатые языки подойдут лучше. Хотя бы тайп юнионы научишься использовать, простейшую функциональщину array_map вроде ещё не запретили и прочее; 4) Го как правило в компании появляется всё же как второй язык и поэтому чаще всего это уже взрослые проекты в фазе переписывания. Это тоже и снижает количество опций для джунов в индустрии, и зачастую повышает требования.
Но тут ключевое требование это > _нормальный_ проект на php Сама пыха стала с годами сильно лучше, но там всё равно велик шанс нарваться на очень говняный проект, который тебе ничего хорошего кроме денег не даст и не научит. Поэтому, маст хев: symfony или laravel, php8+ (чем больше, тем лучше, старая версия обычно означает хуевое легаси. 7+ ещё нормально, 5+ не бери ни в коем случае), использование встроенной в язык статической типизации, она в php несерьезная, но это лучше чем ничего. И максимально беги от любых crm, вордпресса и кастомных фреймворков.
А на го если всё таки решишься, то рекомендую пробовать крупные конторы типа авито, где хотя бы научат бест практисам и будет какая-то более менее выстроенная архитектура. Также очень популярен озон, но чет я хз, года 3 назад они были техническим калом с дикой текучкой кадров. Маленьких контор избегай, хз чего у них там внутри, а ты скорее всего ещё слишком неопытен, чтобы детектить копролиты на этапе собеса.
>>2830394 У нас в бигтитьке все девопсы что-то пишут из инструментов своих на гошке. Так что забей на макакинг этот, катись в девопсы и потом оттуда можно уже и в сисяны и в инфрастракче девелопмент и прочее.
>>2830528 1. зп у программеров больше 2. вакансий у программеров больше 3. любой программер может стать девопсом, потому что мы и так умеем конфиги писать, а вот девопсу чтобы стать программером пришлось бы долго учиться нормально программировать
>>2831722 1. Падают вниз 2. Ты категорически не прав, конкуренции на вакансию девопса - 5 человек, на любую программистическую - от 50 до 1000 3. Роль девопса не только конфиги писать
>>2831797 1. Нихуя, растут вверх 2. Вакансий все равно больше, при этом "конкурируют" с тобой как правило 99% вкатышей со скиллфектори и прочего скама, так что их можно игнорировать 3. Как и везде там много всего, но я занимался админством, для мозга это все равно нативнее чем программирование и переход программеры->девопсы для мозга легче чем наоборот. Не нужно учить новые паттерны мышления, просто учишь новые инструменты да и все. Не говоря уже про то, что как программер я и так и кубы настраиваю периодически, и метрики пишу и смотрю, и тд и тп, так что футуршока у программиста особо быть не должно
>>2832122 1. Используй массивы, [2]string тебе даст массив с фиксированной длиной 2 элемента. Любые операции дальше можешь писать самостоятельно (для присваивания можешь использовать стандартную copy), но с дженерик кодом тебе будет тяжко и больно, либо придется передавать все через слайсы, что мб обесценит идею. Правда [n]string делать нельзя 2. Используй container/queue или самописный аналог если слайсы не подходят и нужна очередь,стек или что-то специфичное 3. Тебе никто не мешает самому оперировать длиной слайса, make([]T, X, Y) позволяет выставить и len и capacity. Например foo := make([]T, 0, len(bar)*2); foo == append(foo, bar...) тебе даст слайсровно в два раза больше вместимости чем исходный 4. Используй []byte и сырые поинтеры, если умеешь. Но если ты задаешь такие вопросы, то скорее всего не умеешь 5. Скорее всего тебе это все не нужно, используй слайсы и не еби себе мозг. В реальной жизни у тебя практически никогда не будет задач, когда тебе реально понадобится >>2832400 6. По гошному скорее всего будет сделать свою структуру type LimitedSlice[T any] { s []T; limit uint64} и самому реализовать для нее операции append, set, тп. и там же проверки на превышение лимита
>>2833434 >VS code отлично справляется вообще со всем Хотя бы сохранить значение выражения в переменную и подставить в местах где оно используется, VS Code уже научился?
>>2833648 >Понятия не имею о чём ты говоришь Ты блядь даже бабу IDE не нюхал. Пишешь ты код if foo.Bar() > 0 { ... } Потом ты понимаешь что тебе надо что-то сделать с foo.Bar(). В нормальной IDE ты делаешь introduce/extract variable и у тебя создаётся переменная с значением foo.Bar(), а там где был foo.Bar() вставляется эта переменная. Это простейший рефакторинг, даже переименование сложнее. И его нет в этой убогой VS Code.
Приветствую, эксперты. Вопрос про смену стека: всю жизнь двигал кнопочки на шарпе в впф, а теперь захотелось перейти в бэк на go. Без опыта работы собственно с бэкендом попустят на собеседовании, или достаточно продемонстрировать умение прогать и наличие представления о дизайне систем?
Хочу перекатиться в Go/Rust, при том, что опыт коммерческий в Го у меня уже был. Просто когда работу менял, согласился пойти в команду, где Go/Python использовали, при этом зп апнул в два раза. Но в действительности оказалось, что проект - легаси монолит на питоне, с двумя микросервисами написанными на Go сборку, которыми всего лишь один человек занимается. Сейчас, поработав там уже с начала февраля этого, появилось уйти на другой проект. Причины просты - легаси монолит на питоне плохо поддерживается у нас. Память течет как не в себя, в произвольные моменты времени начинают течь потоки - периодически с нихуя внезапно возникает 250к системных тредов, которые ложат машинку и ее приходится перезапускать. И куча других проблем. При этом на микросервисы распиливать монолит не особо хотят. Разговоры об этом ведутся, но каждый раз выползает скуфидон-противник микросервисов и начинает доебывать всех вопросами о том, что нам это даст и не проебемся ли с микросервисами, и почему микросервисы это плохо в его понимании.
>>2834678 >Память течет как не в себя К слову эта проблема у нас решается перезапуском. 6 раз в сутки по очереди перезапускаем каждую виртуальную машину. Когда-то слышал, что в некоторых местах, где жирная джава крутится, перезапускают сервера раз в сутки, так вот у нас на питоне перезапускают 6 раз в сутки.
>>2834678 >Python на проде земля гавной тем даунам, кто затащил неподходящий инструмент на проект. >Rust/go Отлично зарекомендовали себя в вебе. А голанг это "хуяк-хуяк и в продакшен"
>>2834649 > Если челик студент, то нужно сразу в гоху вкатываться. гхм гхм > 2) Пыха больше склонна к фрейморкам, что является большим подспорьем для новичка, есть миллион гайдов, примеров "как делать", да и в целом ты работаешь и растешь на какой-то архитектуре. В го же, наоборот, фреймворки не любят и каждый проект собирается в соответствии со взглядами конкретного лида (в лучшем случае) или девелопера (в худшем); Поэтому на пыхе тебе будет и легче, и ты приобретешь больше архитектурного опыта и знания паттернов, для новичков это очень полезно; > 3) Го это в целом довольно примитивный язык, без негативных коннотаций, просто по факту: в языке очень мало встроенных возможностей, даже дженерики до сих пор каличные; Новичку как правило лучше набраться кругозора и потрогать/посмотреть больше вещей и здесь какие-то более богатые языки подойдут лучше. Хотя бы тайп юнионы научишься использовать, простейшую функциональщину array_map вроде ещё не запретили и прочее; Удачи начинать с го, а потом по любой причине оказаться вовне и охуеть от непонимания, что делать с трейтами, что такое промисы, что такое observable и тд и тп. В радикальном случае такой студент гошник может не знать, что такое слои, middleware, di и прочую базу, потому что попал на особо "хардкорный" проект
>>2835157 > Удачи начинать с го, а потом по любой причине оказаться вовне и охуеть от непонимания а зачем? годик продержишься и тебя будут звать работать гошником. >непонимания, что делать с трейтами, что такое промисы, что такое observable и тд и тп так работа это не образование. нахуй устраиваться писать хуйню, если всё это можно в бэкграунде подтянуть? учитывая што большая часть студентов уже имеет опыт с петоном/плюсами/жавой и разобраться в этой хуйне проблем не составляет. если составляет, то сочувствую конторе, которая таких нанимает
>>2835449 Почему разработчики го это всё скрыли? Даже в джаве эти конструкции открыты и можно создать свои аналоги. Создали слайсы, но программист на го не может создать свои слайсы, потому что не может управлять массивами.
>>2835940 Я ничего не предлагаю, а лишь пытаюсь выяснить делают-ли так. Часто наблюдал, что в программировании не очевидных действий стараются избегать. Инициализация всякого говна в n-пакетов ощущается не очевидно.
>>2835958 В некоторых ситуациях импорта (без инита) получаются пустые переменные и твой трюк не прокатит.
Решил давеча попробовать сделать свою игру на ебитене, и я чето так и понять не могу, как мне асинхронно обрабатывать клики/ивенты? У меня значится была задумка сделать как в юнити InputSystem. Есть ActionMap или чето такое, где мы биндим действия к клавишам и методам с асинхронными колбеками. В итоге накидал примерно такой код. Все работает, только вот если я слишком часто нажимаю кнопки, то игра жестко фризится, а иногда даже из-за неё зависает комплюхтер, как это можно исправить? И в принципе я чето не ебу, стоит ли лучше сделать дерево апдейтов объектов и обновлять каждый раз всех потомков, имхо, в конечном итоге это будет очень долго работать
>>2836202 > В некоторых ситуациях импорта (без инита) получаются пустые переменные и твой трюк не прокатит. не понел. оно в одно и то же должно компилироваться. мне кажется что ты говоришь про ситуации, когда пакет вообще не импортят (например sql драйвер) и смешиваешь кейсы.
>>2836309 Я про переменные окружения. Если проебаться с порядком инициализации, то получаешь баги с тяжёлой диагностикой источника. Ну если у тебя не хелло ворлд.
>>2836315 ну это уже баг. если он происходит, то явно не надо так делать, и как его решать уже твоя эксперность должна выбрать. если хочешь избежать глобальных переменных, то можно из мейна эти переменные инжектить в сущность. либо пофиксить код пакета. из интересного, вот такая хуйня например ловится на этапе конпеляции https://go.dev/play/p/75IuKEZa3qE
>>2836339 Вот я и хочу все инициализации в одном месте делать, а результаты по пакетам разбрасывать. Т.е. сразу видно все операции и не надо по директориям лазить, чтобы что-то поправить в переменных. Вопрос в том, не говнокод-ли это?
>>2834678 >Память течет как не в себя, в произвольные моменты времени начинают течь потоки - периодически с нихуя внезапно возникает 250к системных тредов, которые ложат машинку и ее приходится перезапускать. Проблема в вашей криворукости, а не питоне. Если вы перепишите на го, ваши кривые руки не выпрямятся.
>>2836227 Судя по твоему коду это твой первый опыт. Поэтому хуярь дальше, учись писать горутины. В итоге у тебя игровой движок это как ивентлуп, нажатие кнопок выпускает событие, а обработчик это событие читает. А механизм любой
Начал вкот пару недель назад. Можете скинуть репозиторий или тутор какой нибудь с protobuf+grpc. Все что смог найти это либо трёхлетнее гавно где половина команд уже устарела либо типичный хелловорлд где пишут только сервер и юзают постман в качестве клиента. Хотелось бы что нибудь с 2 микросервисами и базовым обменом сообщениями между ними. И чтобы хоть какая нибудь рил-ворлд структура проекта была а не всё свалено в кучу.
>>2836999 Ну это хуита, потому что разрабы написали, что вообще лучше всего использовать Update, иначе может быть плохо. В итоге я сделал дерево для процессов и для ui (LayerTree, UILayerTree) (инициализация всего этого добра пик1) и обосрался, потому что я не понимаю, что мне делать дальше. Ведь мне нужно из обработчика коллизий внезапно! обработать коллизии и вызывать событие или хотя бы сделать так, чтобы персонаж не мог дальше идти, сталкивался просто.
Я вот хз что на этом этапе делать, потому что из вариантов: 1. ивент бусси - мы даем доступ к каналу связи, ебошим что-то типа кафки на каналах, воркеры работают, обрабатывают команды и тд, но это уже звучит как мега говно 2. прокинуть нужные сервисы и вызывать что-то через них, но это нифиге не loose coupling, когда мы 25 сервисов друг с другом связываем зависимостями
>>2837145 Тоже сейчас на пыху перекатываться буду. По советам из /b/ выучил голанг+питон с соответствующим стеком, а работы для джуна хуй да нихуя. Если го, то обязательно 2-4 года коммерческого опыта, а на питоне только всякое говно с ботами, бустерами, парсерами. В моём миллионнике дико востребована пыха и 1с, плюсом гигакорпорации сишников с жавистами ищут, но там алгосы надо знать хорошо.
>>2838366 Он никогда не отработает, потому что криворукие программисты не отпускают массив или карту. Часто ещё делают её глобальной, т.е. она будет жить, пока процесс не убьёшь.
>>2838705 Скорее тебя выпизднут на мороз вместе с предложениями многочасовых ревью. Больше ценятся люди, которые могут прикрутить костыль к вундервафле, чтобы кабаньи фичи быстрее выкатить.
>>2838711 Такой подход работает очень ограниченное время. Проект быстро придёт к состоянию когда вносить изменения в продукт станет сложно, долго и сопряжено кучей багов.
Скажите, за сколько часов вы бы сделали это тестовое (пикрил1)? При следующей зарплатной мотивации вакансии (пикрил2) Я себя оцениваю на джуна го, я бы это сделал часов за 8, норм ли такое тестовое вообще?
>>2839933 ну я бы из интереса сделал, т.к. с голой кафкой и графкюелем не работал. а так да, часов за 8 можно разобраться и накатать. хотя за 100к конечно нахуй надо. если бы это было задачкой на работе, то 2-3 рабочих дня
>>2839933 откуда джун знает как с графкуелем и кафкой правильно работать, а если что и напишет, то все равно мидлу придется все чистить вилкой либо вообще переписывать
Анон подскажи ньюфагу. Как в net/http передать в функцию хендлера запроса внешний объект (который уже запущен и в фоне выполняет вычисления, вызывать его на каждый запрос не надо, надо просто периодически выводить то что было насчитано в фоне). В питонячем aiohttp все просто. А тут сложна, сложна и нихуя не понятно.
>>2840120 ну ты либо можешь хендлер сделать кложуром и захватить свою зависимость, либо воспользоваться функциями высшего порядка https://go.dev/play/p/LXu2IxkCpR_7 , либо хендлером сделать метод у объекта, у которого есть ссылка на твою зависимость
>>2840138 к слову, последний варик наиболее традиционный для реальных сервисов. у нас под каждый хендлер заводится свой тип с методом Handle, в который через конструктор New передаются зависимости.
>>2840138 Но ведь замыкания - это не решение проблемы, а просто перенос её в другое место. Замыкания берут объект не явно из скоупа более высокого уровня, только в данном случае этими неявными будут w и r, а уже искомый объект будет явно. В таком случае с точки зрения концепта это ничем не отличается от не передавать объект ваще = он будет доступен через скоуп общего уровня. Так даже лучше, ибо неявно будет передаваться 1, а не 2 объекта. >>2840148 Спасибо за совет. Так и сделаю.
Короче, есть реальная возможность вкатиться на стажёра гошника через контору в которой я работаю ща (мне так сказали в конторе что к своим хэары больше присматриваются) в кал-центре. И типа были даже случаи подобные множество.
Подскажите какие курсы/книги читать? есть какой-нибудь гайд?
Из релевантного - когда-то давно учил джаву/спринг стек, делал небольшие пет проектики. Шаблоны/алгоритмы почти не трогал, но в принципе понимаю как это подтянуть.
Пиздец, смотрю всякие конференции, доклады, презентации от впараши/газона/шмяндекса и 90% контента это вода ебаная. Половину видоса рекламят свои помойные параши вторую половину рекламят свои курсы, а между этим говорят "мы вот самые быстрые юзаем хттп3, Квик, по нескольку тсп коннекшенов на загрузку файлов, у нас сдн по всей России", но ебаная закешированная страница ВК грузится 20 секунд, на Яндекс маркете каждый товар в выдаче подгружается как картинки по диалапу в 90х. Причем я не на каком то дальнем востоке или Урале и всякие гуглы/амазоны/фейсбуки грузятся мгновенно. Почему так нахуй.
>>2841078 >Причем я не на каком то дальнем востоке или Урале и всякие гуглы/амазоны/фейсбуки грузятся мгновенно. Почему так нахуй. У Гугла все очень хардкорно по веб морде, там чистый С++ с упором на оптимизацию перформанса. Дальше сервисы, там самые употребимые тоже стараются располагаться как можно ближе, куча метрик на перформанс с алертами на его проседание, автоматическое масштабирование сервисов при росте нагрузки. Там понимают насколько важен быстрый отклик. Не можешь быстро вернуть данные - быстро покажи пользователю, что запрос обрабатывается.
А у Амазона инфраструктура говно, у меня видео с amazon.de постоянно подвисает на предзагрузке. Это при том, что я в .de и канал норм.
>>2843884 У них в бесплатном курсе для Го одна вода. Вместо объяснения тем просто дают ссылки на статьи. На весь курс только пара сниппетов с кодом по типу хелловорлд. Ебаную дефолтную документацию не смогли нормально в курс оформить, сомневаюсь что в Продвинутом курсе что то по другому. Просто инфоцыгане.
>>2843911 Вот я взялся изучать го 3 дня назад. Смотрю видосы, делаю серваки по мануалам, но у меня куча вопросов, типо что такое этот writer, что внутри request, как там под капотом происходит принятие/отправка реквеста, насколько оно вообще многопоточно само по себе. Вот могу я просто хэндлеры кидать в горутину? Что с ними вообще делать там можно. И никто это не обсуждает. Все этим просто пользуются. Только самому сидеть ковырять или где то есть разбор таких вещей?
>>2844105 Меня не столько пугает отсутствие материалов, сколько что всем пофиг на это. Как сделать то-то? Делай вот так. Почему именно так? ... Нет ли в работе такой хуйни, что все просто повторяют заклинания по созданию веб сервисов без понятия что реально происходит внутри?
>>2844095 >что такое этот writer интерфейс >что внутри request >насколько оно вообще многопоточно само по себе >Вот могу я просто хэндлеры кидать в горутину? Что с ними вообще делать там можно заходишь в Jetbrains GoLand -> пишешь хендлер -> go to declaration or implementation, смотришь сорсы
>>2844105 Всё правильно сделал. Сервисы на голанке это сборная солянка из гавна и макарон всегда. Нет НИ ЕДИНОГО хорошего фреймворка, как yii Или laravel
>>2844113 Какую-то хуиту ты сейчас написал. В стандартной библиотеке все максимально следует стандартам и нет никакой магии совсем. Просто берешь сорсы и читаешь. Специально язык такой сделали, чтобы читалось легко.
>>2844784 >В стандартной библиотеке все максимально следует стандартам и нет никакой магии совсем. Стандартная библиотека написана, в зависимости от того под чем сидел разработчик. В стандартной библиотеке 2 функции сортировки слайсов, у одной функция сравнения возвращает bool у другой int. Почему? Пошёл нахуй, вот почему! А та которая с bool имеет функцию StableSort. Как реализовать StableSort имея только функцию сравнения <=? Лучше тебе не знать сынок.
>>2846216 >Так с помощью этой операции можно вывести любую другую. И увеличить количество сравнений в 2 раза. Ахуенно!
Ну и в целом охуенные решения типа type Interface interface Тут И нейминг от бога и сама концепция. В нормальном языке, ты у типа реализуешь функцию compare() а дальше просто передашь массив/список этого типа в функцию sort()/max()/min(). Но это конечно же не говей. Говей это создать тип для слайса, запиздячить туда функцию сравнения и базовые операции для слайсов. Вот тогда то его и можно будет отсортировать.
>>2847435 У меня есть вышка на погромиста, но я всё равно не понимаю где брать инфу по го. Вот все дают ссылки только на базовый синтаксис, а как писать полноценные веб-приложения - такого уже нет. А между тем там очень много вопросов: от архитектуры до инструментария.
>>2847589 >или по какой причине их никуда не берут? Потому что с 2014го года дефицит программист сходит на нет, сейчас 95% работающих программистов - имеют стаж больше 5 лет. 5% это те, у кого меньше 5 лет.
Нет НИ ОДНОЙ причины нанимать каких-то джунов, стажёров, это всё великое наебательство. Если ты вкатился до 2018го, то ок, можешь осваивать дальше профессию. если ты вкатился во времена ковидного хайпа - то будет смещён с пьедестала более старыми игроками на рынке
>>2847609 Я постоянно слышу обратное и что новых программистов набирают. Правда не на го, а на другие более ходовые языки типа джавы и РНР. Го действительно самый худший вариант для вката. Ну может хуже ещё раст какой-нибудь.
>>2848358 Базой я называю всю реализацию, которую на следующий день люто дебажил. >нахуя До этого задания я знал только один фреймворк и как его тестировать. Это был стимул прокачаться по знаниям.
>>2847609 >Нет НИ ОДНОЙ причины нанимать каких-то джунов, стажёров нуу им можно платить меньше. работают так же, как выгоревшие сеньоры >Если ты вкатился до 2018го, то ок, можешь осваивать дальше профессию. если ты вкатился во времена ковидного хайпа - то будет смещён с пьедестала более старыми игроками на рынке я за пару месяцев до локдаунов в 2020 вкатился, сразу в гошку без опыта. увольнять будут? рекрутеры пока сами пишут. за жизнь только по трём вакухам сам написал, когда искал первое место
>>2849647 >нуу им можно платить меньше. работают так же, как выгоревшие сеньоры Нет. Даже выгоревшие сеньоры, понимают что нельзя делать res, _ := someFunc(...) // no error should happen потому что он обязательно случится, хоть бы ты 100500 раз проверил аргументы функции. И куча другого говна, которого они наелись за свою карьеру. Сенька не пишет код в N раз больше джуна, он больше думает о последствиях. Чтобы не ёбнуло на проде, а если ёбнет, то хотя бы найти концы в логах. Он понимает, что работа это не про клин код, а про фичи для заказчика, но ты потом это говно поддерживать будешь. Поэтому надо и баланс соблюсти. Что пусть вы 100% договорились с другой командой про сроки и АПИ, но контролировать все равно надо.
Вот пишут, что го всегда передаёт параметры функций по значению, но тут же говорят, что срезы и карты ведут себя по другому. Почему разработчики не унифицировали все типы, чтобы они передавались по значению. К чему эти исключения?
>>2849966 Строго говоря, тут нет противоречия. В го действительно все передается по значению, в том числе и мапы/слайсы. Ведут же они себя так, потому что они содержат указатель внутри себя. Если ты сделаешь что-то вроде https://go.dev/play/p/sm3e0nhrfnz то ВНЕЗАПНО встретишь такое же поведение, несмотря на передачу "по значению".
Сделано же так для того, чтобы избегать "лишних" копирований, так как мапы и слайсы зачастую бывают очень большими, то копировать их 100500 раз между всеми функциями будет очень накладно. В серьезной разгработке на го обычные структуры с большим количеством полей тоже начинают по указателю передавать, чтобы избегать копирований.
>>2850102 С картой разобрался, но срез - это вообще пиздец. Они создали такую структуру, чтобы пользоваться ей адекватно, необходимо прям ковыряться в её кишочках. Да зачем было её инкапсулировать, если без знания кишочков, я не могу ей пользоваться?
>>2850380 Всё равно не понимаю. Вот допустим у нас: s -> "foo" f -> struct { S -> ptr -> "foo" } Далее поменяли "foo" на "bar" в f и должно получится, что s -> "foo" f -> struct { S -> ptr -> "bar" } Но почему у нас s поменялась? Эта переменная вообще на стеке лежит и указывает на строковый литерал.
> на стеке Нет, компилятор сделает эскейп анализис и выделит память в куче, тому що лайфсайкл выходит за пределы тела функции. Ну конкретно в этом примере не выходит, лол, но нутыпонел.
>>2850449 Ты меняешь значение переменной, а не строку.
вообще наверни рича хикки про идентити вс валюе, познай дзен и навсегда забей на байтоебство
>>2850552 До этого примера, я считал, что хорошо понимаю указатели. Есть опыт на сишке и ассемблере. Но здесь явно какая-то неочевидная магия в голанге.
>>2850697 Их так никто не использует, имхо. Погружать адресацию глубже одного уровня это извращение какое-то. Дебажить потом будет тот же умник, который эту хуету написал.
>>2850659 1. это просто файл который большинство оболочек читают по дефолту, максимально оболочконезависимый. есть всякие .bash_profile/.zprofile и т.п., но чтобы не дублировать всякую хуйню, можно либо их не заводить (баш например .profile тогда будет по дефолту читать), либо тупо сорсить .profile из них. 2. rc файлы могут не загружаться при логине, если их явно из profile не засорсить. т.е. в общем случае все переменные, которые ты ставишь в rc, доступны только в интерактивных сессиях - например, когда ты явно открыл терминал и там запустил программу (т.е. если ты просто запустил бинарник или скрипт, то он их не увидит). профайл файлы (.profile/.bash_profile/.zprofile) исполняются при логине и переменные доступны всем программам.
>>2850743 >rc файлы могут не загружаться при логине Анончик, помоги, я вот эту таблицу составлял по баш-документации. Но похоже я что-то не так понял. Вот ты говоришь, что >rc файлы могут не загружаться при логине, если их явно из profile не засорсить Есть такое. Но с другой стороны, когда у нас обычное окно терминала, (== non-login interactive), логина же нету, т.е. ~/.profile не должен загружаться получается?
>>2850781 > , т.е. ~/.profile не должен загружаться получается? сам файл не должен. но переменные наследуются от родительского процесса. когда ты логинишься, запускается логин шелл, читает .profile и потом спавнит другие процессы, которые наследуют установленные переменные.
>>2850109 Не совсем так, прям ковыряться в них не обязательно. Ты должен знать базовые правила: Если ты пытаешься менять значения слайса, то помнишь, что значение поменяется везде; Если ты что-то в него добавляешь, то возвращаешь его по аналогии с функцией append; Если делаешь append, то всегда только в виде X = append(X, ...) и никак иначе. Соблюдай их и всё будет just fine. Я согласен, что можно было сделать чуть удобнее, например прикол с тем, что append может вернуть тебе старый слайс, а может как бы новый мне не очень нравится и я бы сделал по другому. Но в целом ты просто привыкаешь к трем правилам и становится норм, в реальной разработке об этом даже не задумываешься. С мапами же все сильно проще, так как у них нет хитровыебанного append'а.
>>2850264 Ну тут ничего сложно тащемта нет, изич. Если ты когда-нибудь писал на плюсах то вопросов вообще 0. Конкретно так, как это сделал я - обычно оно не используется, это был просто пример. Хотя сами указатели и фигня с тем, что структура передается с указателем внутри передается "по значению" - это очень популярная история.
Даже давай так скажу, указатели встречаются регулярно, но в целом изменение чего либо по указателю это антипаттерн и используется нечасто, кроме ресиверов у структур (всякие методы типы `func (s S) Set(value string)`) и работой с пакетами типа sql или json (им как раз нужно указатели передавать). Поэтому так просто не делают и проблем с этим нет. 90% использования указателей это или оптимизация для того, чтобы не копировать жирную структуру лишний раз в новый скоуп, или как способ сказать, что переменная опциональная/nullable.
>>2850438 Тебе действительно нужно почитать про указатели. Это переменная и она действительно лежит на стеке, но при этом тк она это указатель, то в качестве своего значения она содержит адрес другой переменной, которая уже будет в куче. И сделав `*f.S = "bar"` я прошел по этому адресу и поменял значение той, другой перменной из кучи. Сравни https://go.dev/play/p/sm3e0nhrfnz и https://go.dev/play/p/FOIuo62RCCs , разница должна быть очевидна.
>>2850456 const a string = "blabla" println(&a) // свалится с ошибкой компиляции
Ребят подскажите, а то я туплю есть ли какой способ вызвать дженерик функцию с правильным типом. Внутри функции без дженерика, которая принимает произвольной Obj any указатель на структуру с данными
Что мотивирует вас при локальной разработке использовать gopath? Я понимаю, если у вас дев докер, или в продакшене это где-то может быть нужно. Но почему вы не используете gomodule?
>>2851448 я только вкатунов видел, которые по старой инфе из книг учатся. откуда информация, что кто-то модули не использует?
я настраиваю гопатх чтобы делать go mod init без названия модуля, тогда оно само из названий папочек всё подхватывает. у меня GOPATH=~/.local/share/go и ~/.local/share/go/src это симлинк к ~/src
>>2849367 >Продолжаем подчищать за лысым дебилом его дебильные косяки Расслабь булки фембойчик. Просто ряд разрабов не понимают как работают замыкания. C# в свое время тоже менял семантику https://habr.com/ru/articles/141270/ . Java изначально сказала, что замыкания только на final переменные. В Говноленге нет final, так что идут по пути Шарпа.
Возник вопрос с пагинацией: Как ее реализовать на го базовыми методами (без горма и прочего) Как я понял хорошая практика реализовывать это не через лимит оффсет а сравнением столбцов типа: SELECT * FROM mytable WHERE (created_at, id) < ('2023-09-22' :: timestamp, '228') ORDER BY created_at, id LIMIT 3;
Какую хорошую практику использовать, чтобы доставать значения для сравнения? Где их хранить? Типа < даты и меньше id.
>>2852002 Так а откуда мне взять прошлые значения для параметров created_at и id? Для первого запроса понятно, а если допустим будет страница номер 10, с чем мне сравнивать столбцы как добыть параметры предыдущей страницы? Спасибо за ответ
>>2851999 Ну я ознакомился с мением в авторитетном источнике в интернетах, что для высокой нагрузки оффсет хуйня потому что при большом количестве записей последние страницы будут ворочаться еле еле.
>>2852019 > при большом количестве записей последние страницы будут ворочаться еле еле. Это да. Но разве поиск строк по индексам не должен помочь? Не Seq Scan имею ввиду
>>2851999 >>2852024 Чел правильно сомневается, это известная ловушка при работе с большими таблицами. Суть в том, что для того, чтобы получить твои строки с неким оффсетом, тебе логично нужно все остортировать и прочитать все строки перед твоими, потому что ты заранее не знаешь, что скипать а что нет, особенно в случае каких-то сложных сортировок. Поэтому любоая реляционная бд начинает тормозить при больших оффсетах и никакие индексы здесь не помогают. Именно поэтому гугл и прочие стали page token'ы, которые по сутия вляются айдишником последнего просмотренного тобой элемента.
Соответственно именно так эта задача и решается, если представим, что у тебя последовательные числовые айдишники ака сериал, то если ты вернул последним айдишник 100500, то в следующем запросе делаешь select * from blabla where id > 100500 order by blabla limit blabla и базе вообще не нужно заморачиваться и выстраивать "лишние" строки перед твоими, она сразу берет только нужные и работает уже только с ними.
Отвечая на изнчаальный вопрос >>2851982 >>2852017 Если у тебя айдишники числовые, то они по определению упорядоченные и таймстампы тебе для этой задачи не нужны, можешь прям с фронта (ну или чего у тебя там) получать в качестве page token айдишник последней записи и все. Хранить эту хуйню нигде не нужно, просто возвращая фронту набор строк отдельной переменной верни ему айдишник последней и пусть фронт присылает тебе его сам при следующем запросе. Сложнее будет если у тебя там uuid. По идее они тоже бывают с гарантией порядка, но если нет - то тогда используй только uuid, просто перед основным запросом отдельно ходи в базу, доставай по pk нужную строку и доставай из неё свой created_at, ну и уже сравнивай как сейчас делаешь.
Соответственно > Так а откуда мне взять прошлые значения для параметров created_at и id? фронт тебе сам должен их передавать, если он запрашивает эти страницы постранично. То есть по дефолту там ничего, после первого же запроса ты вернешь первую страницу и данные для второй, потом он запросит вторую и ты вернешь ему её и данные для третьей и тп.
> Для первого запроса понятно, а если допустим будет страница номер 10, с чем мне сравнивать столбцы как добыть параметры предыдущей страницы? Просто "от балды" с таким подходом в рандомную страницу не ткнуть, это верно. Ограничения подхода, ничего не поделаешь. Есть техники вида по быстрому взять итератор в базе, пробежать и выписать себе айдишники 1,5,10,20,50 и тп страниц и вернуть их пользователю но это ну такое.
Но кстати если у тебя это пет проект или тестовое задание, то тебе скорее всего нахуй не нужно заморачиваться с этим. Бери оффсет и не парься. Я программирую уже почти 10 лет сейчас в финтехе где у меня ~лярд строк в некоторых таблицах и почти никогда такие оффсеты не бывают нужны, чтобы такое городить. Пользователям обычно не нужны n-тысячные страницы.
>>2851927 Замыкания как работали, так и работают, их семантика не поменялась. Ты хоть текст по ссылке прочитай.
И это не единичное изменение - буквально все усилия команды разработки после взлёта сабжа направлены на исправление косяков лысого дебила, о которых буквально каждый говорил ему ч самого начала.
>>2852119 Ну смотри сам, работы программистом осталось на пару лет. Деньги на мифическое айти будет только в зарубежье. С русским языком ты никому не нужен будешь
Sup, /b/ /pr/. Есть вопрос по тестам. Как тестировать хэндлер у которого есть id в ссылке? Типа ссылка:порт/апи/id Вроде тестирую как описано в гайдах, однако возвращает ошибку что неверный id параметр)
Получается путь такой: Из ссылки берется id через context.Param и конвертится в int и далее этот инт передается и далее удаляется из базы запись по id. Кроме id никаких вводных параметров нет. Код тестов: Вывод консоли:
>>2852480 Ладно, не то написал, нахуя нужны мок, стаб фреймворки/либы, в которых нужно дополнительно разбираться, если можно самому заглушку простую сделать?
>>2852484 унифицирует код. иначе приходишь и у тебя от пакета к пакету разные ручные моки, с которыми нужно разбираться. у некоторых будут всякие returnErrorOnMethodSaveStuff bool, у других будут кложуры под методы задаваться или будут разные конструкторы, напилят там фанкшнал опций и всякой другой хуйни. а так разберешься с парой фреймворков и всё везде одинаково. ну и экономит время на написание, когда освоишься - сгенерировал и осталось экспектейшны написать.
хотя если что-то мокается мапой с одним методом и мапа понятнее выглядит в тестовой таблице, то можно и ручной мок написать.
>>2852476 Теперь вызывается, Однако в консоли пишет что: expected call at /handlers_test.go:107 doesn't match the argument at index 0. Got: 1 Want: is equal to 1
>>2852484 Удачи со своей заглушкой каждый раз программировать хуйню типа "ожидай 3 вызова метода foo(a,b,c) и чтобы a>10, b="bbb", c = false, а потом не больше одного вызова метода bar()" Чем дольше сижу на программаче тем больше вопросов, сидит ли здесь кто-то кроме меня и совсем уж джунов
>>2852537 >ожидай 3 вызова метода foo(a,b,c) и чтобы a>10, b="bbb", c = false скорее "ожидай AnyTimes() вызова метода foo(gomock.Any(), gomock.Any(), gomock.Any())"
>>2852579 моки могут и в юнит-тестах и в интеграционных использоваться.
в юнит-тестах они могут как мокать внешние зависимости вроде БД (т.о. интеграционный тесты превращаются в юнит-тесты) или внешние сервисы (обычно мокается твоя внутренняя обертка к апихе), так и внутренние зависимости - всякие другие пакеты того же проекта (т.о. юнит-тесты получаются более изолированные и простые). в интеграционных тестах моками заменяют совсем внешние зависимости, которые независимо от тебя могут поменяться/упасть - т.е. внешние сервисы, но не БД твоего сервиса. в отличие от юнитов, тут моки уже могут подниматься отдельно, например https://hoverfly.io/ , и к ним идёт реальное обращение по сети.
>>2852617 как бы нет, но вообще да. если прод упал и юниты не отловили какой-то тривиальный баг из-за несогласованности в критичном сценарии, то возможно стоит написать.
у нас такие тесты пишутся не всегда, обычно обходятся юнитами, а интеграционные чисто на работу с БД. а блэк-бокс интеграционные, которые весь сервис тестят, обычно только на самые критичные сценарии пишутся. пирамида тестирования как бы соглашается.
если ты говоришь что без походов во внешние сервисы смысла нет в этих тестах, то это уже должно енд-ту-енд тестирование покрывать
>>2852628 > если ты говоришь что без походов во внешние сервисы смысла нет в этих тестах, то это уже должно енд-ту-енд тестирование покрывать ну или хотя бы отдельные от основных интеграционных тестов и не блочащие пайплайн. хуево будет, если ты не сможешь фиксы катить на прод, потому что на стейдже сломали какой-то сервис
>>2852651 Поделись как живешь щас, особенно в сравнении до ИТ. Может тянки появились, одеваешься в крутой шмот, снимаешь хату с джакузи или может купил мерседес?
>>2852660 на мне сейчас литералли шмотки, которые я купил, когда за 35к стажером устроился. теперь я снимаю с себя плащ и волшебную шляпу, подхожу к тебе и провожу ладонью по нихуя, я любитель жить как панкбомж. разве что развратился на яндекс.еде и пивасе. пару лет назад съехал от родителей, обустроил себе рабочее место (ну, поставил рядом с раскладным диваном из 90-х стол с регулируемой высотой и два 32' моника). решил купить акций и СЛУЧИЛОСЬ. потом опять, и опять СЛУЧИЛОСЬ. съебал в армению с билетом почти за полторы тогдашней ЗП. экономить на пивасе не приходится, но копеечка копится слабо, потом еще ебаться с нерезиденством придётся. на социализацию сейчас забил хуй, из дома обычно только в магаз выхожу.
>>2852702 просто какой-то выданный dell. как выпустился из вузика пересел на линух полностью. но 95% у нас в компании на маках и то же самое мог бы отвечать кто-то из них.
>>2852541 Это как раз был бы говнокод, потому что вместо этих any может логично быть хз что
>>2852569 Тащемта это не всегда внутренняя реализация, часто это сайд эффект, который является частью логики. Например, заведение данных во внешнем сервисе, тогда ты мокнешь какой-нибудь метод create.
>>2853797 Чтобы знать, когда мапа подходит, а когда нет. В других языках ты ещё можешь выбрать тип мапы под конкретную задачу и для этого тем более нужно знать особенности
>>2854058 1. Немного некорректно сравнивать, совсем разные ниши. Го скорее для производительных серверов, питон для прототипирования. 2. Питон сейчас больше в ML или скриптах для девопсовых штук. 3. Имхо го получше будет, пистон слишком динамический и слишком непроизводительный. А с многопоточкой там пиздец уже просто исторически.
>>2854223 Полный пиздец, ты явно не шаришь, причем даже сам не понимаешь, какую ахинею несешь. Никогда больше не давай никому советов, ни сейчас, ни в жизни вообще.
Производительнее никаких го и тем более уж раста он быть не может. Потому что во первых питон есть питон и поэтому львиная часть ресурсов у тебя уходит на то, чтобы обеспечивать питонячьи фичи типа динамической типизации, декораторов и прочего. То есть, в условной сишке, го или расте объявляя int ты выделяеешь на стеке свои честные четыре байта и всё. В питоне переменная может содержать что угодно, туда можно писать что угодно потом и тд и тп. Поэтому пистон тебе выделит некую абстрактную переменную не помню как в питоне аналог zval называется, которая может содержать что угодно. Она будет жрать больше как раз из-за того что это не просто 4 байта на стеке, а некий довольно сложный конструкт указатель на кучу лол. И потом каждый раз у тебя будут тратится ресурсы на проверку типов, приведение типов, тд, тп. И никакой cpython это не исключит, максимум оптимизирует тривальные случаи. Во вторых, даже если ты втупую вызываешь некие сишные функции, то ты будешь тратить кучу ресурсов на интероп между питоном и си из-за разницы в представлении данных и прочего, что будет гораздо медленнее, чем если бы ты просто вызывал одну сишную функцию из другой. В третьих, "просто вызывать сишку" не получится, так как ты сразу начнешь с размаху биться лицом об особенности программирования на си, всякие сегфолты и тп. В итоге ты уже или программируешь на си (но тогда нахуя тебе питон вообще?), или уж на питоне. Всякие написанные под питон и заранее скомпилированные экстеншены это как раз второй случай. В четвертых, в питоне очень каличный рантайм. Там до сих пор тупой счетчик ссылок в качестве гц вместо хотя бы cms, но главное, что там до сих пор каличный и очень тормозной асинк. В отличие от гошного планировщика с горутинами или растовых рантаймов под это дело. В итоге если у тебя программа это не один большой цикл который нихуя не делает и не параллелится, то это будет тормозить из-за особенностей рантайма и нихуя ты с этим не сделаешь, вот вообще.
>>2853754 Вместо того, чтобы десять раз в разных местах мокать метод криэйт, просто пишешь какую-нибудь ин-мем реализацию и чекаешь конечное состояние.
Алсо > 2к24 > тестировать отдельный метод криэйт вместо генерации хождения по автомату через проперти-джен фреймворк
Как вообще идеоматично создавать функции для ListNode (связный список): как методы или как отдельные функции? С одной стороны хотелось бы работать со списком как с удобной сущность и иметь готовые методы: добавить, удалить и т.п. Но так как сам указатель на начало списка может изменяться, то мы вынуждены возвращать его обратно. В итоге получаем такой код: ln = ln.Add(10) Дак может лучше создать интерфейс по аналоги со слайсами и создавать отдельные функции, а не методы? ln = AddNode(ln, 10)
>>2852645 >Строка - это тоже срез? Как она выглядит под капотом? Не совсем, у слайса есть length и capacity , а у строки только length потому что, строка иммутабельна и аллоцируется нужной длинны.
>>2854250 Чел, ты сейчас конечно базовые вещи говоришь, только это всё касается чисто питонячьего кода, коим приближением является cpython (не надо мне тут про девственный С заливать). Тяжелые либы пишут на С и пишут далеко не ссаные вкатуны. Всё скомпилировано, готово к использованию. Там выставлено апи для адаптера на питоне, отсюда и производительность, кладущая на лопатки го, расты и прочее говно, которое пытается занять нишу Чед-япа. Питончик только команды отправляет, да данные получает для какой-нибудь минимальной обработки. Нет там значимых потерь на таких операциях.
>>2852131 >Замыкания как работали, так и работают, их семантика не поменялась. Ты хоть текст по ссылке прочитай. Зайчик, используй свою попочку чтобы удовлетворять своего бойфренда, а читай глазами. Я нигде не писал что менялась семантика замыканий. И я не только прочёл, но и дал ссылку на аналогичный кейс у C# очевидно что к этому моменту твоя жопка уже устала и про C# ты не прочёл.
>>2854705 >>2854789 Просто сделай %+v и там будет видно, что это структура Data&Len. Т.е. передаётся пара Data&Len. Передаётся по значению именно по этому и строка не может быть nil.
>>2854982 > не понимают как работают замыкания Ещё раз, дело не в замыканиях, а в семантике цикла, не понимают как работаеь цикл, замыкания тут ни при чем
>>2855256 >Ещё раз, дело не в замыканиях, а в семантике цикла, не понимают как работаеь цикл, замыкания тут ни при чем У цикла как раз семантика самая простая и очевидная. Есть переменная цикла и она одна, ровно то, что написано. А хотят сделать неочевидную вещь, чтобы переменная цикла на каждой итерации выделялась заново. Как при этом будут работать циклы вида: for i := 0; i < 10; { i++ } решительно непонятно.
>>2854883 > Там выставлено апи для адаптера на питоне, отсюда и производительность, кладущая на лопатки го, расты и прочее говно, которое пытается занять нишу Чед-япа. Такого не может быть чисто физически просто потому, что в самом-самом лучшем случае соревноваться будет код некого экстеншена на си (и затраты на его вызов будут "нулевыми" только в идеале! А на самом деле все равно будут нихуевые косты и за вызовы из питонового рантайма, и за сам рантайм. Ну разве что если у тебя вообще поток исполнения никогда из твоей "либы" не выйдет, но тогда питон не нужен) и код на расте. Которые концептуально равны, но на самом деле llvm под капотом раста в любой более менее сложный код напихает тебе примерно дохулион оптимизаций. В итоге в самом оптимистичном для тебя варианте (который как правило и всплывает в бенчмарках) у тебя будет какая-нибудь ссаная либа на си с тупым эвент лупом, которая читает и/или пишет в ответ некую статику в противовес сложному но комплексному tokio или чему-нибудь в этом роде, где код на си "выиграет" только по причине крайней примитивности задачи.
Но самое смешное, что даже в этом случае (скажем https://web-frameworks-benchmark.netlify.app/result) питон не входит в топ двадцать, проигрывая той же пыхе, потому что у пыхи намного удачнее сделано сишное апи и в целом она популярнее.
>>2855678 >пук-среньк Аргументы то будут? Может расскажешь как переписать Scan() по правильному? Или так и будешь пиздеть какой ты охуительный разработчик, а все остальные говнокодеры?
>>2855724 > как Ты решительно очень тупой, но тредик уже помог Даше, бгг.
Чтобы почём зря не откапчивать капчу, заодно отмечу, что можно глянуть гит блейм и убедиться, что говнокод наклал именно тот, выпиливанием чьего говнокода из сабжа занимается команда сабжа последние скоро очень скоро уж как десять лет.
>>2855851 >Я тупой и могу только писать под себя Ок.
>Чтобы почём зря не откапчивать капчу, заодно отмечу, что можно глянуть гит блейм и убедиться, что говнокод наклал именно тот, выпиливанием чьего говнокода из сабжа занимается команда сабжа последние скоро очень скоро уж как десять лет. Да всем насрать на твои сексуальные отношения с лысым из бразерс, у нас тут про другое тред.
Сап анон. Поправь, если вопрос странный. Почему до отправки элемента в канал, кто-то должен его уже слушать? В противном случае выводит fatal error: all goroutines are asleep - deadlock!
>>2857545 Мб ты имел в виду такой код без строчки со слипом:? func test(ch chan int) { ch <- 1 }
func main() { testCh := make(chan int) go test(testCh) // time.Sleep(time.Second) если поставить тут слип, то всегда будет паника close(testCh) fmt.Println(<-testCh) }
Поведение очевидное: Если горутина успеет попробовать записать в закрытый канал, то будет паника Если не успеет, то паники не будет, т.к. программа завершится до возможной записи в закрытый канал
>>2857610 Я к тому, что даю целую секунду на запись, потом закрываю канал. Очевидно ожидаю успеха, но иногда горутине не хватает секунды (хз почему) и случается паника. Ещё не понятнее вывод нуля, а потом паники, при том что я запускаю только 1 горутину, которая отправляет данные в канал.
>>2857628 >>2857545 1 отправка в канал не успевает произойти до завершения программы. канал закрывается и ты вычитываешь zero-value 2 отправка в канал отрабатывает после fmt.Println, до завершения программы 3 отправка в канал отрабатывает после close и до fmt.Println
>>2857644 >Очевидно ожидаю успеха так никто не обещает, что горутина начнет исполняться в течение секунды. она начнет исполняться, когда шедулер её соизволит запустить >иногда горутине не хватает секунды (хз почему) и случается паника у тебя паника случается, когда горутина как раз успевает запуститься и отправить в закрытый канал
>>2857748 This. Ну и отсутствие понимания, что эти нули можно бесконечно выводить из закрытого небуферизированного канала. Изначально думал, что fmt.Println(<-testCh) ожидает получение элемента.
>>2858529 во-первых возвращаемое значение функции не аддрессабл. т.е. это уровня взять адрес от суммы интов &(3 + 5). его нужно сначала положить в переменную. во-вторых, кажется что ты совсем не то, что хочешь, делаешь с поинтерами и если переделаешь нормально, то тебе адрес брать и не нужно будет.
Кто-нибудь работал с krakend или другими готовыми API-шлюзами? Мне нужно, шобы работало реверс-прокси в сервисы с авторизацией вида: сходить в юзер сервис, проверить данные и отправить доп заголовок с айдишником пользователя в запросе к сервису.
Вообще оцените норм ли такая схема сервиса как на пике, если нет, то что переделать и почему. CB - это cirquit breaker, чтобы бд могла восстановиться.
Сап, анон. Нужен тактический совет. Что я хочу: Клиент получает информационные сообщения и список актуальных данных с сервера. Что я для этого сделал: Создал 2 обработчика вебсокет, один из которых доставляет сообщения, а другой массив байт с данными. Всё работает, проблем нет. Вопрос: Грамотно-ли такое разделение с множественными соединениями по вебсокету? Сейчас увидел, что с помощью горутин можно запихнуть всё в один обработчик, но придётся немного заебаться на фронте, чтобы определять чего там с сервера пришло. Короче, классический вопрос, как делать хорошо и как не делать плохо.
Посмотрел литературу по Go и пришёл к выводу, что ни одна книга не описывает стандартную библиотеку. Почему-то все ограничиваются только базовыми возможностями. А между тем в net/http довольно много содержится. Порой люди торопятся скачивать какую-нибудь библиотеку по http, когда всё что им нужно уже есть в стандартной, просто они про это не знают из-за недостатка информации в этих книгах.
>>2861796 Потому что книги пишут точно такие же Джуны, которые их и читают, только эти пиздеть умеют. А ты думал, что они пишутся крутыми профи? У реальных профи на это времени нет, да и не выгодно это
>>2861796 научи бедного стандартной библиотеке и он будет знать стандартную библиотеку, научи его читать документацию и он не будет ныть о том, что его чему-то не научили.
>>2863455 Охуенный же яп по сравнению со скриптовыми парашами. Учить меня долго не понадобится, ибо уже даже через кишки успел пройти. Не маргинальные либы для освоения закончились, сейчас щёлкаю задачки от нехуй делать. Что ещё надо работодателю?
>>2863485 Пыху буду учить дальше, только если это понадобится для переписывания чего-то с неё на гошку.
Суть такова - у меня за плечами 5 лет успешной разработки на шорпах. Правда из-за специфики текущего места работы за три с лишним года я развился в этом направлении примерно никак, так что на данный момент имею что-то ждуна+/повидла- по знанию платформы, пожалуй.
Работа окончательно заебала, собираюсь её менять. И тут два стула - дрочить шорпы, чтобы проходить собесы, и собственно их проходить, или же свичнуться на няшную гошку. Во втором варианте скорее всего будет уменьшение зарплаты хотя бы на первое время, но на ~120-130 я протяну изи. Что посоветуете? Свичиться ли, и если да, то есть ли советы мудрые?
А как в профессиональной разработке получают различные конфигурационные значения? Через текстовый файл конфига? Через переменные среды? Или через интерфейс командной строки?
Как понять в каких случаях надо беспокоится о состоянии гонки, а в каких нет? Пока это всё выглядит какими-то магическими советами, что мол дескать вот тут будет гонка, а тут не будет. Ни какого общего принципа нет. Запоминать все эти миллионы случаев ведь не реально.
>Ни какого общего принципа нет. Запоминать все эти миллионы случаев ведь не реально. чево? тривиальные гонки всегда видны. что-то посложнее может не всегда воспроизводиться, но рейс детектор с нужными условиями/достаточным количеством попыток отловит и скажет
>>2865218 >рейс детектор отловит и скажет ладно, тут я погорячился. вполне можно написать код, который атомарно делает хуйню уровня "списываем деньги в одной транзакции, а начисляем деньги в другой транзакции"
>>2865161 чел, есть всякие варианты и они разнятся между конторами. у нас весь конфиг формально в .env и подгружается при запуске, но сам .env генерится из файлика, который настраивает помимо переменных еще инфру и метаданные сервиса т.п. а в других компаниях были приняты жсон/ямл конфиги, и томлы тоже видел. так что какой бы ты путь не выбрал, велик шанс что после оффера тебе придется гнуться.
>>2865274 у нас коннекшн стринги и всякое такое добавляется при генерации .env. т.е. если ты указал в главном конфиге, что у сервиса есть постгрес, то при локальном разворачивании у тебя постгрес сам в кубере развернется и в .env сгенерится к нему коннекшн стринг.
>>2865024 > в каких случаях надо беспокоится о состоянии гонки В которых ты можешь читать/писать одновременно, не? Что за тупой вопрос, если есть более одной горутины, которые шарят что то между собой - офк будет гонка
>>2865518 Некоторые структуры из стандартной библиотеки потокобезопасны. Так что это не тупой вопрос. Возможно ты сам до конца не понимаешь всю сложность.
>>2864260 Всё сразу. Какие-то вещи через конфиг: например лимиты, трешхолды, какая-то статическая информация. Переменные среды используются редко, разве что всякие локали и таймзоны. Параметры запуска: порты, пароли, адреса.
>>2865024 Придерживайся двух простых правил. 1) Если что-то в нескольких потоках только читается, но не меняется, то похуй, никаких гонок нет, забей. 2) Если что-то в нескольких потоках ещё и меняется, то всегда без исключений скрывай эту хуйню под мьютексом (на будущее - у теб ещё есть rwmutex, sync.Map и sync.Once)
> 2024 > давным-давно существуют системы типов, исключающие рейс кондишны, и потокобезопасные бай дефолт структуры данных > Придерживайся двух простых правил... Индустрия такая индустрия, эх
>>2867446 Но их действительно нет, они обещали в следующей версии сделать нормально, но воз и ныне там, генерик аргументы не работают с генерик ресивером
>>2866730 >> 2024 >> давным-давно существуют системы типов, исключающие рейс кондишны, и потокобезопасные бай дефолт структуры данных >> Придерживайся двух простых правил... Типа там нет других проблем.
>>2867433 Щас бы слушать какого-то левого хуя вещающего на 3.5 калек не то, чтобы я был с ним полностью не согласен, но всё же
>>2866730 Ты же знаешь, что ничего бесплатно не бывает, да? И твои эти "бай дефолт потокобезопасные" структуры в реальности показывают эффективность хуже, потому что под капотом там всё равно зачастую те же блокировки. В го у тебя есть выбор, если ты заранее знаешь, что конкурентной записи не будет, то используешь обычные структуры и не получаешь просадок по скорости. Если заранее знаешь, что будет - то - Или делаешь блокировки сам поскольку ты знаешь свой код и знаешь, где они нужны и что под них лучше запихать, например чтобы под одной блокировкой происходил целый набор действий, которые должны происходить атомарно. - Или берешь как раз стандартную структуру, sync.Map (кстати rwmutex скорее всего будет для тебя лично оптимальнее), sync.Pool, sync.Once или что угодно ещё - и получаешь какое-то стандартизированное поведение. Что же касается систем типов, то нравится тебе или нет - то го не такой, он умышленно примитивный с точки зрения типов. Такие здесь правила игры, если тебе это не нравится - то иди в раст скажем хотя я уверен что ты не шаришь и другие системы типов кроме джавовой никогда и близко не видел
>>2867823 Чел проебался, думаю он хотел сказать, что ты не можешь делать дженерик агрументы у методов структур, либо у функций, либо у ресиверов и это реально не круто, надеюсь, в ближайших релизах исправят. В последнем вон, вывод типов улучшили, теперь хотя бы писанины стало меньше.
>>2867836 > эффективность хуже Сперва корректность, потом эффективность. Преждевременная оптимизация и вся хуйня. Кроме того, это зависит от характера нагрузки. Кроме того, это не относится к афинным системам типов!
> у тебя есть выбор (имплайинг в других языках выбора нет) - намеренная логическая ошибка, у тебя всегда есть выбор, просто некоторые языки по дефолту корректно себя ведут в современной вычислительной среде, а некоторые - нет.
> делаешь блокировки сам В любом языке можешь делать блокировки сам.
> Или берёшь 1. Джве версии на каждую структуру данных - идеологически неверно (ты не туда имплемнтишь!) 2. Правильно так: ну вот если после запуска профайлера на реальной кодобазе выясняется что можно повысить производительность на 10% берёшь как раз стандартную структуру unsafe.SingleThreadOnlyDangerousMap и чётко обложив все её упоминания аннотациями и стресс-тестами получаешь какое-то потенциально неопределённое поведение.
> он умышленно примитивный Нет, просто роб пайк некомпетентное хуйло, за которым теперь разгребают эту кучу утята разумеется не могут даже помыслить крамолы, ведь авторитет.
> я уверен Я уверен, что твою мамашу ебали хачи
>Чел проебался Я ж то же самое и сказал блеать, ну да ладно, главное что в итоге всё-таки понятно что имелось в виду
>>2867705 >Другие есть. Но они и в го есть. А вот рейскондишнов нет. А в го есть. Силу косноязычную, в тебе вижу. Изъясняться тебе, понятнее учиться надо. Великим йоба инженером станешь ты, тогда.
>>2868071 Вообще ахуенно! Залетных нет, только те кто подписан или ищет по тегу. Раньше Java так делала, и было очень лампово, но потом пришли пидоры и стали перекатывать.
>>2869410 Это хеллоуворлд, а не полноценное веб-приложение. Как писать полноценные? В плане архитектуры, используемых библиотек, фреймворков, инструментов.
>>2869404 с какой целью интересуешься? если ты вкатыш, то тебя на рабочем месте научат - нужно просто повторить структуру соседних проектов. она не везде одинаковая))
>>2871641 Ничего это не значит, у тебя этот код не скомпилируется даже, так как имя string уже занято. Ну или возможно ты долбоеб и у тебя там в коде не string а String, тогда кто-то хз зачем просто создал кастомный тип.
Почему по го нет нормальных курсов? Везде какая-то обрывочная инфа, типа вот смотрите есть протокол http, а свой http-сервер сами напишите, го это же просто)))
>>2873264 А что ты еще ожидал от 3rd party опенсурс сообщества, что тебе все нормальное на блюдечке делать будут? Как белый человек сам скомпиль, че ты как лох какой то
Ещё в голанг надо постоянно следить за какими-то новинками среди библиотек. Я вот вообще не знаю ни про какие библиотеки и где узнавать про них. Почему не напишут какой-нибудь фреймворк, чтобы там уже всё было? Просто берёшь и пользуешься.
>>2873689 А что не так с го на Винде? Требовалось написать небольшую прогу, которая будет запускаться хуй знает на какой Винде в каких условиях, возможности отладки не будет. За вечер перенес функционал с питоняши на гошку и отправил, все работает, на го не писал до этого. Мимо.
>>2873667 >Почему не напишут какой-нибудь фреймворк, чтобы там уже всё было? Просто берёшь и пользуешься. Так есть уже! https://2ch.hk/pr/res/2871266.html Берешь и пользуешься, раз в неделю обновляешь конфигурацию и горя не знаешь!
>>2873264 >22.04 >LTS ну во первых это лтс, а во вторых убунта это не роллинг релиз и гошку туда запакетировали не для вас молодой человек. хочешь новые версии, используй анстейбл/тестинг или роллинг релизы уровня рача. удел фиксд релиз плебеев это юзать древние пакеты или ставить себе хуйню в обход пакетного менеджера. >>2873966 зачем хороший язык запускать на хуевой системе? то то и оно. ну и конпелируется долго, я вообще охуел по 10с ждать вместо 1с
>>2874779 С чего ты решил? В универах как раз не приучают изучать что-то новое и следить за популярными библиотеками. Мы там писали в турбо паскале 7.0 сортировки и лишь для своих проектов можно было на С++ что-нибудь пописать.
>>2874291 > сферы применения А не похуй где оно применяться будет, если оно там работает, и работает точно так-же? Ты разработчик, и не деплоишь на своем компе лол, тебе тупо код писать надо, ты обычная макака и не больше. Ты если фронт писать будешь, тебе не обязательно прямо в браузере писать шиз
>>2875603 Конечно не похуй, ебаться для бэкенд разработки с вендой - это абсурд, для пердоль которым нечем больше заняться кроме как пердолиться с ос может и подойдет
>>2877306 Самый главный плюс в том, что в го нет спринг-евангелистов и они не превратили код в спринг-какашку. На го можно писать по заветам Егора Бугаенко, внедрять зависимости в main, а не размазывать аннотации по всему коду.
помогите собрать вот это: https://github.com/HyperDbg/gui какие-то ошибки вылезают при сборке (liteide): "C compiler "gcc" not found: exec: "gcc": executable file not found in %PATH%"
>>2879400 Потому что го умеет только консольные программы компилировать, а графические - нужен модуль с С/С++. Это как в РНР подключают модули расширения на Си.
>>2879519 из интереса довёл до конца. поставил mingw-w64-gcc и сделал GOOS=windows CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc go build . в вайне запустилось (?) даже без ебли
>>2879532 поделись, залей куда-нибудь!) тут слишком сильное колдунство - сам не соберу. Что вот это значит: GOOS=windows CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc go build где это прописать? mingw поставил, liteide 38.3, GoLang 1.20.07 (т.к. на Win7_x64 сижу).
ну смотри GOOS=windows CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc go build . делается в консольке из папки с main.go. или например можешь на гитхабе/гитлабе пайплайн настроить и сохранять бинарник как артефакт билда. ну или аналогично в IDE можно настроить что делает кнопка "сбилдить".
раз ты на винде, GOOS тебе скорее всего не нужно указывать. в CC наверное (я хз про ваши виндопроблемы) нужно написать либо полный путь к бинарнику mingw, либо добавить его в PATH и написать имя бинарника. т.е. либо что-то вроде CC=c:\mingw\bin\x86_64-w64-mingw32, либо CC=x86_64-w64-mingw32. или сам зайди в папку и посмотри как там бинарники называются
>>2879593 какая-то х-ня на 28Мб! Это вообще-то должен быть Гуй к "новому мощному отладчику" HyperDbg. Файл скачался и запустился, но менюшки (кроме Exit) не работают, файл для отладки не выбирается, опции-плагины- вообще ничего не нажимается. Либо собрал криво, либо лыжи не едут.. Ладно, подожду ещё, пока в сети нормальные сборки появятся.. Спасибо!
>>2869573 Что ты понимаешь под полноценным? Ну смотри, берешь любой хттп-сервер гошный, прикручиваешь постгрес/монгу, опционально какой-нибудь билдер запросов. Обмазываешь все логгером и метриками, опционально реализуешь грейсфул дегрдашейшн и грейсфул шатдаун. Смотри, чтобы слои не протекали друг в друга, связывай компоненты через интерфейсы. Далее (а лучше в процессе) покрываешь свое поделие юнит тестами. Потом делаешь докер файл, довольно урчишь. Когда научишься поднимать свой йобаэппликейшн в докере, докинь интеграционных тестов на докер композе. Да, можешь обмазаться openApi, если у тебя http. Охапка дров - и круд готов.
>>2880937 откликнулся на стажерскую вакуху на hh чисто чтобы попробовать, ведь модный молодежный язык. когда ответили, прошел go tour и пошел на собес.
>>2880937 Устроился на работу, вышел оказалось что пишут на го. Ментор сказал почитать мурзилки про го и тамошние технологии. Через пару недель начал говнокодить.
>>2881900 >А на кого ты устраивался? SRE/SWE. У нас на твой стек особо не смотрят, все равно учиться с нуля. Но у меня за плечами 15+ лет опыта в топовых компаниях.
Привет, программач. Открываю для себя го. Столкнулся с проблемой, что при тестировании хэндлера сравниваю 2 строки, однако происходит какая-то залупа. Типа "строка" not equal "строка" Принтил с рефлектом, это точно string Принтил значение - абсолютно одинаковые строки (пик1)
Однако в ошибке он высирает какие-то слэши и непонятно откуда \n, хотя я не ожидаю такого поведения в своем кейсе (пик 2)
Попробовал сегодня голэнд от жидбрейнс и что-то жопа сгорела насколько всё неудобно. Даже элементарно набираю пакет fmt и в вс коде просто жмёшь Tab и получаешь готовый импорт. Тут надо нажимать "сверх-удобную" комбинацию Alt+Enter. Далее в вс коде можно набрать ключевые буквы функции и она быстро найдётся и это очень удобно, когда полно всякие Printf, Println, Fprintf и т.п. В голэнде же хрен вам, а не ключевые буквы, надо набирать функцию целиком по порядку, пока их тупая система не отфилтрует лишние, т.е. если функция различается только последними буквами, то вы будете всегда(!) набирать функцию целиком. В общем, не знаю за что они требуют такие деньги. Этот кал хуже бесплатного вс кода с бесплатным плагином от самих разработчиков го.
>>2884740 Так нах тебе вручную импортить, просто начинаешь писать fmt.Pr и тебе сразу в дропдауне все подходящие, оно тебе и импорт само вставит, никакие альт энтеры не нужны
>>2886920 Клеппман Мартин. Высоконагруженные приложения. Программирование, масштабирование, поддержка Мартин Роберт С. Чистая архитектура. Искусство разработки программного обеспечения Алгоритмы. Построение и анализ Мартин Роберт С. Чистый код. Создание, анализ и рефакторинг Ричардсон Крис. Микросервисы. Паттерны разработки и рефакторинга Бхаргава Адитья. Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих
а как вкатиться без ком.опыта в прог на go, я того все ебал варик попрогерить на фрилансе или знакомым с ип поделать заказы, чтоб они указали еще, что работал с ними и пойти на работку в офис кофе пить?
>>2890705 Есть гоферы-пхпешеры, которые переписывают с РНР на го, а есть гоферы-питонисты, которые переписывают с питона на го. Поэтому ищут чуваков, которые знают сразу два языка. Часто это свичеры.
Прочитал в книжке Боднера, что не стоит пользоваться пакетом net/http для создания своих клиентов и серверов на нём. Они только для тестовых примером годятся, так как обладают рядом недостатков. Вопрос: чем тогда пользоваться в реальной работе?
>>2890751 чем читаешь? >A default client instance (cleverly named DefaultClient) is found in the net/http package, but you should avoid using it in production applications, because it defaults to having no timeout. Instead, instantiate your own. и литералли строчкой ниже пример как инициализировать свой клиент с таймаутом
Почему интерфейсы не имплементируют методы с приемником-указателем? К примеру, тот же Stringer отказывается работать, если в методе указать приемник как указательный тип (со звездочкой)?
>>2892886 >К примеру, тот же Stringer отказывается работать, если в методе указать приемник как указательный тип (со звездочкой)? Схуяли? https://go.dev/play/p/pSvIj30R9qN
Попробую на словах описать задачу Предположим в пакет A есть структура MegaStash с полем []Gems (Gems определена в пакете A) В пакете B есть структура WoodenStash с полем []Gems (Gems опеделен в пакете B) В пакете C есть структура IronStash с полем []Gems (Gems опеделен в пакете C)
Во всех пакетах Gems имеют идентичную структуру и сигнатуры методов. Вообщем задача переложить Gems из WoodenStash или IronStash в MegaStash, точнее смаппить объект Wooden/Iron в Mega Причем из какого stash будут перекладываться в MegaStash определяется в runtime Вроде можно было бы кастануть, но все упирается что слайсы элементов разных типов разные и такое не скомпилится Пробовал описать интерфейс, которые реализуют и все три структуры Gems, н оопять уперся в то, что нельзя взять и преобразовать []struct -> []interface, т.к. O(n)
Вообщем как не ебать себе мозг и решать подобные маппинги, писать на каждый класс маппер - кажется путь в никуда.
>>2895897 >Вообщем как не ебать себе мозг и решать подобные маппинги, писать на каждый класс маппер - кажется путь в никуда. вообщемто так болиемение и делается. >Во всех пакетах Gems имеют идентичную структуру и сигнатуры методов. вопервых нахуя их три. если это из-за того, что разъедутся в будущем, то кастование, даже если бы работало (хотя через ансейф ты вполне можешь это напердолить), отпадает, т.к. просто отложит проблему. >нельзя взять и преобразовать []struct -> []interface, т.к. O(n) так маппер так же за o(n) перекложит
>>2896010 >вопервых нахуя их три да там прокси объект, который проксирует вызов апи других объектов, у которых спецификация одинаковая, но все типы этх структур в разных пакетах и это еще и либа, которую кодген наклепал и да, один из объектов отвалится как депрекейтед в итоге Структуры настолько похожи, что кастуются, т.к. там в основном примитивы в полях
>>2896019 ну если тебе нужно упороться по перформансу, то я бы сделал через ансейф (и не забудь какой-нибудь компайл тайм чек добавить, что эта хуйня реально кастуется 1 в 1). если хочется выебнуться, то интерфейсов бы засунул. ну или по-обычному просто функцию которая сконвертит одно к другому. если кастуются, то это же тупо луп с одной строчкой в теле.
>>2887345 Но ведь кодогенераторы существуют. Я более чем уверен, что в крупных фирмах уже написаны кодогенераторы для создания микросервисов и задача джуна мидла как раз будет заключаться в том, чтобы задать правильные параметры для кодогенератора. В итоге написание микросервисы сводится к запуску и конфигурированию кодогенератора.
>>2895897 По нормальному - писать маперы которые будут перекладывать из А в B в C. Потому что если в А добавят поле, то это не сломает мапинг, а если удалят - то сломает на этапе компиляции. Если ебашить через ансейф, то любое изменение полей меняет бинарную совместимость.
Как организовать правильно структуру проекта из трёх сервисов, чтобы это всё поднималось одной командой докер-компоуза? Вот везде смотрю и там всегда одиночные сервисы, максимум ещё база какая-нибудь поднимается. А у меня у сервисов будет общая кодовая база и каждый по сути билдится из папки cmd/appN/main.go, где appN - название этого сервиса с номером (условно). Но вот как дальше организовать - не знаю. И вообще пишут ли так сервисы или надо их делать отдельными и запускать каждый отдельно через докер?
api (сбилженный proto для всех микропенисов) entity (общие структуры для микропенисов) service_name1 - cmd - - main.go - internal - - entity (внутренние структуры для микропениса) - - usecase (бизнес задачи) - - - ... - - adapter (репозитории, обращения к другим микропенисам) - - - ... - - handler (grpc-, http-ручки) - - - ... docker (Dockerfile'ы) config (конфиги, env'ы) pkg (общие пакеты для микропенисов) - ... proto (собственно proto файлы) migrations (миграции для БД) scripts (bash скрипты для инита бд/упрощения Dockerfile'ов) docker-compose.yaml go.mod go.sum
Жирный - директории. Опционально разбиваешь usecase, adapter и handler на несколько поддиректорий, чтобы интерфейсы слоёв не разростались. Плодишь service_name1, и получается микросервисная архитектура.
>>2897537 Как всрато. Неужели нельзя на несколько реп распределить? Командам только интерфейс взаимодействия знать надо. Нахуя им остальной код проекта?
>>2897151 >Тогда маппинг тоже придется править Если поля добавляются сразу во все 3 структуры - да. Так-то можно просто кастануть один тип к другому https://go.dev/play/p/zhhXOTbk1b Но проблема в том, что если поменять A и B, а C забыть - то ошибка будет в рантайме.
>>2898484 >enity >models/dto Но entity это не не модели, и тем более не дто, это разные термины из разных слоев, одно домен, другое презентейшн/аппликейшн
>usecase >repository Как и юзкейсы и репозитории, это вообще джва разных слоя (юзкейс это вообще бизнес-термин, правильнее называть это интеракторами)
>adapter >service Вот тут ваще кекус, это совершенно разные вещи
>handlers >controllers В некоторых гомоархикектурах это тоже разные вещи, но в моём манямирке это одно и тоже.
Бля, а можно мне тоже зп синьки говнаря, раз у вас так всё плохо с архитектурой. мимо недосинька на питухоне
>>2897648 > Как всрато. Неужели нельзя на несколько реп распределить? На то оно и МОНОрепа. Можно и распределить > Командам только интерфейс взаимодействия знать надо. Нахуя им остальной код проекта? Подсмотреть логику, если дока плохая. Из-за internal случайно не заимпортят