Это копия, сохраненная 29 октября 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
С чего начать:
- В обязательном порядке проходим Go Tour: https://go.dev/tour/welcome/1
- Читаем документацию (рекомендуется начать со спеки и Effective Go): https://go.dev/doc/
- Ознакамливаемся с общим roadmap по изучению языка и сопутствующих инструментов: https://github.com/Alikhll/golang-developer-roadmap (постоянно обновляется сообществом)
Литература:
- Донован, Керниган "Язык программирования Go"
- Также хорошие книги для начала: https://www.golang-book.com/ и https://www.practical-go-lessons.com/ (веб-версия - бесплатная и хорошо подходит для новичков в программировании)
- Книги из списка https://github.com/dariubs/GoBooks
Полезные ресурсы:
- Сборник паттернов и инфы по микросервисам: https://microservices.io/
- Смотрим видео https://www.youtube.com/channel/UC_BzFbxG2za3bp5NRRRXJSw
- Обновляемый список с пакетами: https://github.com/avelino/awesome-go
Небольшая конфа треда: https://t.me/golang2ch более чем живая!
Предыдущий тред тонет здесь: >>2665435 (OP) (OP)
> // Make sure that Foo implements Bar
> var _ Bar = &Foo{...}
Как перестать орать с этого Unterprogrammiersprache?
Очень скоро(2 с половиной человека обсуждали в 2018 году). На самом деле в го все хорошо сейчас, и надо просто поправить несколько багов языка и все
А зачем ему вторая глобальная версия? Язык уже хорош. Проблемы есть, они решаются. Дженерики завезли, хоть они и не были обязательными. Главное, чтоб всё говно подряд в него не пихали и язык не потонул
Очередной шиз не в силах отличить разных анонов.
Алсо, укажи этот активный пилящийся на гитхабе проект)))
А ты по ссылке выше всего пару ишуев за весь 2023 год
Ну и дополню чем то, кроме рандомных высеров
https://youtu.be/v24wrd3RwGo?t=1396
Russ Cox - один из основных разрабов
>пук
Один из пиздеть не будет. Они там про обратную совместимость почти 2 года срались друг с другом.
Это не один из, а буквально человек, который внес основной вклад в язык.
Ишуи на твоем гитхабе не более чем рандомный высер других рандомных людей, их создавать если что каждый может, не нужно быть контрибутором
А остальные четверо основателей там кофе твоему Коксу таскали? С момента публикации кода не кислое сообщество появилось. Ты можешь дрочить на своего лектора сколько угодно, но гошка уже далеко не внутренний проект гуголя.
Пидорская хуйня для геев
Понятно, что нода жрет куда больше, но вот если, условно говоря, на ноде нужен один сервер с четырьмя ядрами и 8гб оперативы, то во сколько раз меньше ресурсов нужно будет go? При допущении что функционал и нагрузка +/- одинаковые.
В JS треде выкладывали сравнение. При самых синтетических условиях Go не более +10% выдаёт. Гигантам такое интересно, а остальные прост повторяют за ними.
ну максимум нужно будет просто перейти на v2 либы стандартной библиотеки вроде math/v2, которую обсуждают.
остальную хуйню завезут специальными флагами и автоматическим переформатированием.
Только есть одно но, гошка умеет в мультитред, потому то нода на беке никому и в хуй не уперлась кроме всякой школоты
Ржавый тоже умеет, вот только на нём до сих пор пишут лгбт маргиналы. Голанг хорош для микросервисов и жонглирования ими, но рыночек решает в пользу ноды. Отсюда вытекает запихивание её в те направления, где жопоскрип ранее не использовали.
На самом деле нода быстрее для прототипирования и MVP, если это не хайлоад, то и на первых этапах жизни стартапа нода лучше т.к. на ней дешевле и быстрее разрабатывать из-за большого количества специалистов. Самое хреновое это взять, например, rust и тогда стартап загнется с вероятностью 90%
Вызов Load() всегда занимает не меньше 1ms
Нельзя делать больше одного вызова Load() в один момент времени.
Реализуйте Batcher, который оборачивает slow.Value и ускоряет чтения за счёт батчинга.
Например, если 1000 горутин одновременно сделают вызов (Batcher).Load(), то можно прочитать значение один раз и раздать всем ожидающим горутинам. Это будет в 1000 раз быстрее, чем вызвать (*slow.Value).Load() напрямую в каждой горутине.
Ваша реализация не должна создавать stale read. То есть, Load() всегда должен возвращать значение не старее последнего Store() на момент начала вызова Load().
Как такое решать на го?
>Ваша реализация не должна создавать stale read. То есть, Load() всегда должен возвращать значение не старее последнего Store() на момент начала вызова Load().
ну тут очевидно что снаружи это можно обернуть в rwmutex. требования к тому, сколько может ждать Store не описаны.
внутри мютекса просто https://pkg.go.dev/golang.org/x/sync/singleflight или самописная альтернатива.
хотя не
>Ваша реализация не должна создавать stale read. То есть, Load() всегда должен возвращать значение не старее последнего Store() на момент начала вызова Load().
ну вот такое тесты проходит например https://go.dev/play/p/idgiLgEFM7d
>не старее последнего Store()
вызова или выхода?
Через канал нельзя решить? Каждая горутина передает канал на запись в в канал батчера, тот один раз читает и пишет в канал каждой горутине?
ну это от компании зависит. у нас например отдельная команда занимается инфрой, а команды которые пилят фичи для юзеров тупо используют обёртки от инфры - в идеале у нас тупо обертки, которые предоставляют "кеш" и "очередь". подключать/менеджить/пилить фичи для их не приходится, но на нас задача их правильно архитектурно заюзать, чтобы было масштабируемо, и тут детали (например нагрузка/макс размер сообщения/доступность) тоже учитывать приходится.
>rabbitMQ
это по-моему какая-то устаревшая дохлая никому не нужная залупа, хотя и у всех на слуху. если она в вакухе, то 100% тебе нужно будет поддерживать легаси
>redis
ну тут реально учить нехуй, просто открываешь доку с командами и ебашишь. разворачиваешь в докере и через терминал можешь все команды сам отдебажить. ну разве что если приходится делать не тупа кеш и ты луа не знаешь, то надо луа выучить. учитывая что для редиса тебе максимум литералли базовый синтаксис пригодится с несколькими функциями стдлибы, то это даже легче гошки.
>kafka
ну типа паблишим читаем, хз. у нас вся работа завернута в свою обёртку. буквально сделать queue.New() и зарегать хендлеры вроде queue.HandleZalupa(zalupaHandler). ну например надо понимать что накать, а что откладывать. и что можно класть в сообщение, а что не стоит (а тут уже надо понимать отличие кафки от натса или другой хуйни).
>это по-моему какая-то устаревшая дохлая никому не нужная залупа, хотя и у всех на слуху. если она в вакухе, то 100% тебе нужно будет поддерживать легаси
Лол, эксперт в треде.
Кролик по сути та же самая хуйня что и кафка с некоторыми отличиями. Та же очередь, точно также используется в продакшене для микросервисов и новые версии регулярно выходят, как раз недавно вышла новая версия erlang и кролик обновили под него, хз откуда ты про легаси взял. Может у вас в конторе раньше был, но по каким-то причинам например слишком много данных весело в очереди и много писалось на диск перешли на кафку, а старое осталось на кролике.
Через каналы наверно, есть горутина, которая слушает и увеличивает его, и есть которые паблишат в канал
мимо нюфаня
Паблишат единичку/нужное число в канал горутины, которая производит увеличение счетчика.
ну внутри канала есть мютекс, только он не из пакета sync))))) https://go.dev/play/p/sEjAeCDYq9M
Купил Порш и Рендж ровер.
https://www.youtube.com/watch?v=1lYPRLkqVS8
Красавчик, смотрел его видосы. Пригласите его в тред.
>Предварительная стоимость курса "Порше за полгода" - 100 000 рублей.
Как раз кредит отобьет, лол
да я хз я с ним не работал, но отец знакомого один раз пришел с работы и сказал что нужно переходить на другую очередь, ничего не объяснил, было какое-то совещание.
энивей на собесе не должны развернуть, если знаеш как хотя бы какой-то очередью пользоваться
Дженерики больше про устранение бойлерплейта.
Я бы объявил интерфейс I с методом обработчиком, реализовал бы его для каждой структуры и канал объявил с типом элементов I. Ну это если логика для обработки сообщений разная.
Правда придется перед тем как положить в канал определиться в какую структуру писать байтики или что у тебя там передается по tcp. Если не прав, то обоссыте.
мимо-нюфаня
>не используя пакет sync?
Разумеется используя пакет atomic!
В целом задача хреново сформулирована. Например для реализации многопоточных счетчиков часто применяют шаблон, когда у каждого потока свой счетчик, а когда нужно узнать общую сумму их тупо суммируют. есть проблема, что часть данных не актуальная на момент подсчета Можно данные в канал слать, как уже подсказали. Можно свой мьютекс на базе атомарного чтения делать но это опять же sync.
В целом за использование чего-то кроме XADD в прод коде, надо пиздить.
Покормлю.
Можно горутины и каналы.
Нельзя sync и sync/atomic.
Анон выше дал правильный ответ.
Встречал реализацию, когда присылают не число, а функцию (команду) инкремента.
Go настолько же оптимизирован, как C, или он ближе к питону и C#?
У тебя в одном пакете несколько функций main.
Либо растащи их по разным пакетам, либо удали лишние
ну это охуенно зависит от задачи. сишку не обыграть, компайлер тут довольно тупой, чтобы скорость конпеляции была быстрой. плюс ГЦ. но зависит конечно же от программы. если ты конкретную асинхронную программу напишешь тупа на тредах, если в сишке ты не ебёшь как делать грин треды и оптимизировать под асинхронность, то сишка соснёт под нагрузкой по сравнению с гошкой.
усреднённо получше шарпа и тем более петона, за исключением корнер кейсов.
>усреднённо получше шарпа и тем более петона, за исключением корнер кейсов.
А еще за исключением более-менее сложной бизнес-логики. Джсоны перекладывать конечно удобно, но строить модели данных с логикой их взаимодействия с только с помощью примитывных структур это величайшая ебля которую можно придумать.
>если в сишке ты не ебёшь как делать грин треды
В Си грин треды только долбоебы делают. На сях запускают N нативных тредов и шарят работу между ними. Почитай про тот же Nginx работает с потоками https://habr.com/ru/articles/260065/
Горутины позволяют писать код с большим удобством, но жертвуют производительностью по сравнению с хардкор подходом.
>>749616
>но строить модели данных с логикой их взаимодействия с только с помощью примитывных структур это величайшая ебля которую можно придумать.
И к сожалению гугл это делает.
Структуры с методами не покрывают потребность?
Что есть в других языках для построения сложных моделей ?
>Почитай про тот же Nginx работает с потоками
ну он заточен бейзикалли под одну задачу, это не новые продуктовые фичи в каждом спринте допиливать. в зделол-годами оптимизируеш-годами пользуешься конечно сишка выиграет.
>запускают N нативных тредов и шарят работу между ними
в такой формулировке звучит так же, как гошка.
если опустить блевотные шахматные альтернативы, то статья тупа про тот же нетполлер в го, только там это главная фича.
за исключением случая, когда это нужно для реализации интерфейса
>Структуры с методами не покрывают потребность?
Покрывает, но кода дохера получается, повторное использование кода низкое, а дублирования много. Может конечно это у нашего проекта такие проблемы.
Структур и функций достаточно чтобы строить сколько угодно сложную хуйню. Функциональный язык, например OCaml, не даст спиздеть. Просто помимо этого язык имеет вменяемую систему типов, нормальный полиморфизм, а не то говно позорное, что завезли в го, алгебраические типы и умный компилятор, созданый учёными.
Просто интересно, откуда у залетных в тред такие познания в других языках и при этом опыт применения Го? Ты на OCalm пишешь продакшен код? Или тут 95% студентота, которая приходит с языком на котором лабу1 написала
приложение периодически шлет GET запросы к одному хосту по нескольким урлам, запросами получаются данные и дальше они передаются обработчику, который парсит данные и должен инициировать POST запрос к тому же хосту.
Хочу сделать асинхронное получение и отправку, т.е. развязать операции с GET и POST.
При этом у серверного хоста есть рейтлимит, который известен клиенту.
Думал сделать простую очередь на одном канале, куда worker-ы для каждого урла будут кидать запросы, а обработчик очереди (канала) будет отсылать их серверу и при этом контролировать, что рейт лимит не превышен. Если превышен, то временно приостановать обработку очереди.
Самое простое решение это отдать канал очереди воркерам, которые инициируют GET и POST звапросы, но кажется это не лучшее решение, т.к. каналом владеет одна горутина, а пишут в нее другие. Но в целом закрывать этот канал необходимости нет. Норм подход? Какой вариант еще может быть? FanIn, FanOut в чистом виде не придумал как сюда прикрутить.
>Хочу сделать асинхронное получение и отправку, т.е. развязать операции с GET и POST.
зачем и нахуя? звучит как переусложнение на ровном месте.
плюс твоя очередь на канале проебется при любом рестарте
>зачем и нахуя? звучит как переусложнение на ровном месте.
Для pet проджекта, хотелось бы реализовать очередь на каналах, чтобы все асинхронно работало. Представим, что сервер готов держать 1000 запросов в минуту от одного клиента, а обработка полученных данных на стороне клиента условно может занимать 5 сек. За это время можно отправить еще несколько GET -запросов + какие-то обрбаотчики могут завершить выполнения и быть готовыми отправить POST. Они могли бы и сами это делать, но нужно тогда как-то шарить значение рейт лимита между воркерами.
>плюс твоя очередь на канале проебется при любом рестарте
это не критично совсем
>но нужно тогда как-то шарить значение рейт лимита между воркерами
ну можно https://pkg.go.dev/golang.org/x/time/rate заюзать.
ну т.е. с 5 секундами на ответ, тебе в любом случае придется дохуя горутин делать, чтобы все 1000 rps заюзать. ну ты там упорешься и будет один/N воркеров который делает геты, один/N воркеров для постов и дохуя горутин с вычислениями. и ты можешь еще разные N каждых воркеров поставить, бенчить это, и всё это будет обмазано каналами/вейтгруппами.
или можно сделать так https://go.dev/play/p/O-7MgQV6Iqy и у тебя логика будет тупой и последовательной, с тем же самым количеством горутин
>Просто интересно, откуда у залетных в тред такие познания в других языках и при этом опыт применения Го? Ты на OCalm пишешь продакшен код? Или тут 95% студентота, которая приходит с языком на котором лабу1 написала
Писал на нем диплом, реализовывал компилятор функционального языка с системой типов Хиндли - Милнера. А потом свернул не туда. Есть коллега которого из Гугла переманили HFT кодить на OCalm.
Мимо другой анон.
fmt.Printf("%p\n", &slice)
func_slice := func(x []int) { fmt.Printf("%p\n", &x); x[0] += 1; return }
func_slice(slice)
fmt.Println(slice)
В пространстве функции main() находится slice с определённой ссылкой на область памяти. При использовании slice в func_slice создаётся копия x с другим адресом в раме. Какого хуя при внесении изменений в копию x, изменяется ещё и slice, который находится в другом пространстве и с другой ссылкой на область памяти?
ну смотри например https://go.dev/play/p/eVU3UsPdcSZ
ты сам слайс и не менял, ты менял значения во массиве, на который слайс ссылается
Есть одна задача, суть такова:
Есть несколько слова с четным количеством символов и нечетным.
Если количество символов четное, то вывести два средних символа, если нечетное- два символа
С четными символами все просто, - работает. А вот нечетными символами, никак не получается вывести два символа.
https://go.dev/play/p/5lnQdUOVojh
Как я понимаю, что нужно добавить какой-нибудль шаг +1. Но как это сделать хз.
Пробовал еще сделать что-то -типа (s[2-1:len(s)/2+1]) но это плохое решение, что как работает с ограниченным количеством символов, если например будет нечетное слово не из 5-ти, а из 7 символов, то выведет три символа, а не два
>если нечетное- два символа
два символа откуда? если примерно посередине, то смотри.
для четного берешь индкесы [l/2-1] и [l/2]
для нечетного - [l/2] и [l/2+1] например (или вообще то же самое, что для четных). остальное это научиться в синтаксис сабслайсинга.
да мне что-то кажется, что задача была не с подъебом про нечётное количество символов, а условие что нужно вывести два как раз к тому, чтобы у чётных/нечётных было одно решение.
https://go.dev/play/p/KM848nzqm23
Почему ссылки отличаются (0xc0000ac018, 0xc0000ac028), несмотря на обращение через поинтер?
Взялся короче написать что-нибудь для практики и портфолио.
У меня давно витала идея приложухи для небольшого бизнеса, где я когда-то работал.
Ментор посоветовал насчёт проектов
>Можно написать сервис, с crud ручками и БД, редисом и кафкой, чтобы потрогать библиотеки и т.д.
Ну я и начал, там буквально десяток табличек: клиенты, заказы, мастера, услуги, номенклатура ремонтируемых агрегатов, самая такая база. И это чисто апи с ручками, т.е. чтобы это реально работало (а я хочу, чтобы это реально работало), ещё не хватает фронта
А я сам 1сник, сижу тужусь и понимаю, что подобную хуиту в 1с накидать работы на 4 часа максимум и там ещё будет из коробки фронт к этому всему.
Сука руки опускаются и как обычно мысли уровня "а тем ли я занимаюсь блядь?". Скажите, мне просто нужно взять себя в руки или я реально делаю что-то не так и можно лучше (в плане взять проект в котором го реально будет блистать)?
Это не троллинг если чё
> А я сам 1сник, сижу тужусь и понимаю, что подобную хуиту в 1с накидать работы на 4 часа максимум и там ещё будет из коробки фронт к этому всему.
Если нужно очень быстро - попробуй https://gobuffalo.io/
>то, что нельзя реализовать в 1С
Способность справляться с большими нагрузками в основном.
Ну и возможность создавать свои индексы в бд в 1с очень порезана, она есть, но через жопу, особенно когда ты хочешь кластерный сделать такой как тебе надо. Это опять же в копилку производительности всей системы в целом.
И возможность без кучи бойлерплейта делать нормальную интеграцию с другими приложениями. В 1с из-за динамической типизации нужно городить кучу верификаторов, конструкторов и прочего безобразия.
А числодробилок в этом конкретном проекте нет.
>>755878
Хм, интересно, погляжу на досуге. спасибо
Спасибо, но в твоем примере сама очередь конечна.
В общем сложная тема, согласен, думаю сделаю проще - запущу несколько горутин, которые делают периодические запросы каждый по своему урлу, воркер с обработкой ответа в этой же функции будет. Рейт лимит может быть заюзаю тот, что ты кинул, либо сделаю простой на RW мютексе, либо в первой итерации проекта вообще откажусь от рейтлимита.
Еще момент учитывай, что если внутри func_slice использовать append, то массив может быть создан новый и добавляемые элементы не будут добавлены в массив оригинального слайса.
>Понятно, что никто в трезвом уме делать так не будет, но формально это все же нарушение инкапсуляции и иммутабельности
это го, привыкай. тут можно io.EOF = nil сделать.
Можно и в джаве такое сделать, только там нет не помню необходимости поля класса наружу выставлять
Посоветуйте го-либу для парсинга ямла, где нет такой беды
смирись, чел. иммутабельность в гошке это когда в комменте написано "не меняйте плз".
>Посоветуйте го-либу для парсинга ямла, где нет такой беды
ну ты в принципе не заанмаршалишь в приватное поле. ну ладно допустим ты затащил весь код парсера в пакет с конфигом, чтобы приватные поля были доступны парсеру. и теперь у тебя конфиг с приватными полями, которые не видны из других пакетов. а теперь ты навешиваешь геттеры на всю эту хуйню. а теперь твой код превратился в жаву
у нас туда засовываются поля для логирования - в хендлере запихиваешь поля из реквеста, там userID хуе-мое, и все внутренние логи будут с ними.
аналогично этому в мидлваре можно положить что-то.
NotifyContext в main.
при консюминге очереди - явные таймауты, чтобы не застопить обработку на какой-то хуйне.
если у тебя сетевой поход во время открытой транзакции в БД (так делать не нужно еба), то тоже надо быть уверенным, что на него есть таймаут.
контекст от ErrGroup также нужно смотреть когда логично использовать, а когда не надо.
>>758143
>смирись, чел. иммутабельность в гошке это когда в комменте написано "не меняйте плз".
В общем таки пришлось обмазать враппером, который содержит указатель на мутабельную структуру, но вне пакета к мутабельной нет доступа. Олсо, а как обеспечивается иммутабельность полей-слайсов? Т.к. слайс содержит указатель на массив, то даже получив его копию можно заппендить в оригинальный массив, хотя нет прямого доступа к полям-слайсам конфигурации. Возвращаю в геттере новый слайс в который копирую элементы оригинального. Я долбоеб и надо было забить или можно так двигаться в Го?
>теперь у тебя конфиг с приватными полями
>а теперь твой код превратился в жаву
ну как бе с одной стороны да, с другой тем самым можно обезопасить от прострела ноги
можно конечно положить болт, и каждый раз при обращении к конфигу извне возращать копию структуры, а не указатель на нее, но тоже как-то ебано копировать всю структуру ради одного поля
>ну как бе с одной стороны да, с другой тем самым можно обезопасить от прострела ноги
да никто не будет твой конфиг внутри бизнес-логики менять, нахуй это надо. ну т.е. это вообще не-проблема в реальном коде.
если ты хочешь альтернативный вариант, то просто не передавай свой ямловый мегаконфиг дальше main. все типы/пакеты, которые ты там инициализируешь, тупо должны принимать значения нужных себе опций на вход NewZalupa() вместо общего конфига.
>но тоже как-то ебано копировать всю структуру ради одного поля
нуу будет у тебя приложуха на две наносекунды медленее запускаться и жрать на килобайт памяти больше на старте.
в go.mod модуль как называется?
в гоше нет ./, все импорты имеют абсолютные пути.
>да никто не будет твой конфиг внутри бизнес-логики менять, нахуй это надо. ну т.е. это вообще не-проблема в реальном коде.
Ну да конечно. Возьмет слайс с чем нибудь из конфига, отдаст в функцию которая вообще не в курсе что это и откуда и там уже меняет элементы слайса.
ну такое только в синхронном коде получится
Допустим, у меня в мейне две одинаковые горутины с двумя каналами: 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<
И такой порядок, судя по аутпутам внутри горутин, сохраняется.
Это мне просто повезло получить воспроизводимый результат, или планировщику так дано работать? Или тут вообще не про планировщик, и я сам явно так синхронизировал все?
GO111MODULE?
короче я почти нихуя не понял из твоего описания. но я бы ожидал примерно такое поведение
1. запускается программа
2. спавнит GOMAXPROCS тредов-процессоров. все кроме одного процессора не имеют работы и засыпают (тут на самом деле не уверен и возможно дополнительные процессоры будут спавниться потом по мере. остальные пункты имеют смысл только если это работает так, как я сказал.)
3. main горутина начинает исполнятся
4. все go func() горутины, которые ты делаешь, кладутся в локальную очередь процессора, который исполняет main
5. когда main блочится на чём-то, процессор, который крутил main горутину, берёт последнюю go func() которую ты заспавнил (т.е. очередь горутин не fifo) и начинает выполнять её
6. в какой-то момент остальные процессоры просыпаются и воруют горутины из очереди main процессора.
если ты всегда получаешь один и тот же результат, то возможно оно всё успевает выполниться на одном треде, когда остальные треды спят без работы.
Звучит правдоподобно. Про стек глубиной 1 для свержих горутин читал.
> Все кроме одного процессора не имеют работы и засыпают
Видимо так. Но почему...
Основы хорошо объясняет, тоже буду вкатываться на 4к+ баксов. https://www.youtube.com/watch?v=lj4fvjlYgFg
Есть некий воркер, который по тикеру выполняет функцию, которая может уснуть или так же может быть прервана в случае получения сигнала (т.к. пробрасывается контекст). Проблема в том, что сигнал на прерывание от ОС может быть получен в момент, когда функция searchForPost спит (т.е. ждет либо отмены контекста, либо записи в канал <- time.After). Получается, что функция может быть в какой-то момент отменена и ожидается, что DoWork завершится кейсом с ctx.Done. Но тикер за время сна успевает видимо подкинуть еще элемент и он срабатывает первым, в результате функция searchForPost срабатывает лишний раз в каждом воркере перед самым завершением работы утилиты. Не понимаю пока, какой тут паттерн/антипаттерн, как сделать так, чтобы если контектс отменяется, то все селекты с ним мгновенно завершались (ну или схожее поведение)?
ты зафокусился на какой-то супер-редкий кейс, когда тикер и контекст одновременно доступны. селект в этом кейсе выберет рандомный кейс. у тебя скорее всего что-то другое происходит, т.к. отменить контекст именно в момент тика надо умудриться.
что ты можешь сделать - в кейс с тикером добавить проверку if ctx.Err() != nil { return }. но как я и сказал, это супер-редкий кейс и эта проверка тебе 99.99999% не поможет (плюс эта проверка где-то внутри searchForPost должна же уже быть, если оно сетевой поход делает).
а хотя я понял, если у тебя searchForPost блочится и не слушает контекст, а за это время тикер тикает, то да, будешь часто получать такое.
ну и конечно можно из searchForPost вернуть ошибку при отмене контекста и выйти если err != nil.
>>762566
Спасибо, проверка ctx.Err() != nil решила проблему. Да весь подвох в том, что searchForPost может блокироваться, т.к. упирается в счетчик рейт лимита сетевых вызовов и просто ждет N секунд до сброса лимита. Хорошо бы еще понять насколько легально и разумно блочить функции, вызываемые внутри селекта и которые могут быть прерваны отменой контекста.
>>762573
searchForPost к сожалению не возвращает ошибки by design, т.к. любой результат ее выполнения считается успешным, а внутренние ошибки просто пишутся в лог. Не хотелось бы ради корректной обработки отмены контекста прокидывать оишбки назад по всему стеку вызовов.
бля, как же вам наверно хуево жить без перегрузок, я уже заебался
Без перегрузок операторов грустно бывает свои числовые типы вроде денег создавать, а перегрузки методов не нужны
Я привел пример где на практике нужна перегрузка операторов, жду от тебя реального примера где это нужно laba1 не считается
Чел блядь я тебе настроение поднять пытаюсь
Называется дженерики, и они у нас есть
Подзастрял с этой задачей, нашел решение только с промежуточным вычитанием исходных каналов в слайсы и последующей отправкой в результирующий канал.
https://go.dev/play/p/Y7lZmdMnGOU
Вроде и норм, но по памяти накладные расходы и пайплайн по сути блокируется до момента окончания записи в исходные каналы. Можно ли сделать как-то на селекте, без ожидания полной вычитки каналов? А если последовательность условно бесконечная?
так же, как два мосива смержить.
читаешь по одному значению из двух каналов. пишешь в выход то, что меньшее (допустим это был канал А). читаешь из канала А, пока он возвращает значения <= значения из Б и кладешь в выход. когда значение попалось больше, то кладеш то большее из Б и читаешь из Б с тем же условием.
Конечно можно конфу передавать в каждый метод через контекст/аргумента (а сам аргумент подставлят ьв тестах), либо написать отдельный конфиг для тестов, но должно же быть что-то проще.
Ты реально настолько тупой или просто приколдесы сюда кидаешь?
https://go.dev/play/p/iN5va0LNsH-
Зачем этот высер слияния каналов с рандомными интами? Проблема в чтении каналов в определенном порядке, который может меняться в зависимости от поступающих значений
Надо было брать самсунг а54....
Можешь пщ+ попробовать, там всё есть
Я сделал супервсрато, не идеоматично, но зато вроде работает все успешно
https://go.dev/play/p/FfbYtO5fTwV
>"""интеграционные тесты (на моках)"""
у тя сложные тесты какие-то.
ну типа если нужен порт, то ты всегда можешь с ретраями подобрать свободный, и если хочешь тестабилити не нужно порт хардкодить/читать из конфига. а вообще если это всё на моках, то нахуй это интеграционный тест
Такой проектик, юнит тесты хороши для бизнес логики, когда можно изолированно от других слоев тестировать. А если есть сеевые вызовы внутри логики, то как без моков.
Скорее это вопрос устоявшейся терминологии. Под интеграциюнными понимают тесты, которые задействуют несколько слоев/модулей приоложения. Например ты хочешь протестировать слой-репозиторий, для этого мокаешь запросы к БД. Тоже самое с сетевыми вызовами. Юнит-тесты это тестирование изолированной функциональности в рамках одного модуля. Например тестирование функции, которая делает какие-то расчет, без сайд эффектов. То, что ты называешь интеграционными это системное тестирование или end-to-end, когда тестируется на стенде. Другое дело, что как в моем случае у меня нет чистых функций практически, все завязано на коннекты.
но в моем случае скорее херовый дизайн, т.к. компоненты связаны внутри методов
import "go.work/tables/components" не работает (это гопота предлагала)."tables/components" тоже. "./tables/components" запретили давно.
>Как вы пишете интеграционные тесты (на моках)?
Никак. Интеграционные тесты - проверяют интеграцию между разными компонентами. В интеграционном тестировании поднимаются реальные инстансы всех компонентов, максимум можно мокать внешние системы. Но предпочтительней, чтобы у них была внешний UAT.
Сам не пробовал, но вот, что предлагают: https://stackoverflow.com/questions/52026284/accessing-local-packages-within-a-go-module-go-1-11
Если используешь модули, то в go.mod модуля data нужно сделать replace модуля tables с указанием локального пути до пакета
да, у нас терминология другая.
допустим, у тебя есть тип А с логикой, завязанный (через интерфейс) на тип Б. если ты тестируешь отдельно метод у А, мокая Б, то это юнит-тест, независимо от того, делает ли реальный Б под капотом сетевые вызовы или это тупо какой-то калькулятор. аналогично тесты для репозитория без поднятия БД, т.е. любые тесты без внешних зависимостей это юнит-тесты.
интеграционные - когда нужно поднять бд/редис/очередь и тупо go test ./... не пройдёт. вызовы в другие сервисы по хорошей практике все равно мокаются.
системные/е2е - когда ходим в реальные внешние зависимости.
Вы как-то разделяете тесты внутри проекта? Наприме юнит тесты в _test файлы, а интеграционный в _it_test?
я обычно разделяю, интеграционные в _integration_test.go (+ билд флаг в них), юниты в _test.go. хотя обычно один пакет не тестируется одновременно юнитами и интеграционными и порой можно видеть интеграционные в _test.go
Отчего он игнорирует y и не аппендит 3 к слайсу
А вот к z аппендит 4
Апендит, но затем перезаписывает. Гугли устройство слайса, там у всех 3-х слайсов "под капотом" один и тот же массив
Что-то у меня такого фокуса не получается. Как там путь прописать?
Распердолил, спасибо за помощь.
https://go.dev/play/p/CErOI1HrNXq
И не перетрет, если в результате аппенда будет создан новый массив.
Этот момент в Го напрягает, конечно, если в коде акробатика со слайсами. 10 раз подумаешь, а стоит ли аппендить в этот слайс или создать новую копию. Чому не завести было высокоуровненвые абстракции?
> 10 раз подумаешь, а стоит ли аппендить в этот слайс или создать новую копию.
Такая и была цель, чтобы не делать неявно О(n) операции
> Чому не завести было высокоуровненвые абстракции?
Например как?
>Например как?
Например как в нормальных языках - List. Который при добавлении элемента растет внутри, но сама ссылка на List остается актуальной. А еще можно сделать 2 интерфейса - mutable и immutable. А ещё можно всякую функциональщину типа map завезти.
Ладно, это я увлекся, это все не говей, ебитесь с кучей бойлерплейта и не жалуйтесь.
> Например как в нормальных языках - List
В нормальных языках никто алокации не считает и срут в хип всем чем только можно. В го же подобную структуру можно реализовать на основе слайса очень просто, но в отличии от слайса она никогда не будет на стеке, т.к. нужны поинтеры
> А ещё можно всякую функциональщину типа map завезти.
Уже
Нет, чел. Это в с++ ты можешь языковыми средствами реализовать вектор и хештеблицу и любую другую структуру данных. А у вас долбоебы сделали частью языка хэштаблицу, это же уровень php
>это же уровень php
В 1с тоже хештаблица часть языка, причем используется везде где в си и go используется struct, потому что в 1с нет структур в привычном понимании, динамикодрисня же.
Причём в доках нигде не написано что это хештаблица, но по контексту можно догадаться.
Эх...
а что тебе мешает реализовать хештаблицу языковыми средствами? компилятор гошки на гошке написан, да и язык тюринг-полный
Забей, он ментальный инвалид. С таким общаться, себя не любить.
Вот вариант реализации мамы - https://github.com/alphadose/haxmap
>В нормальных языках никто алокации не считает и срут в хип всем чем только можно. В го же подобную структуру можно реализовать на основе слайса очень просто, но в отличии от слайса она никогда не будет на стеке, т.к. нужны поинтеры
Ты совсем ебанат который вообще не шарит?
Слайс аллоцирует в куче массив, а на стеке указатели на массив, длину и сегмент. Джава или Шарпе будет делать ровно то же самое, только структура указатели на массив, длину и сегмент будет тоже аллоцирована на стеке, что позволяет не ебаться с
>slice = append(slice, newElement)
а просто
>list.add(newElement)
Разница в аллокации памяти мизерная. Массив для хранения данных и там, и там в куче. Ресайзится кратно текущему размеру амортизированное O(n) для тех кто шарит. Нету нихуя у слайсов, каких-то преимуществ перед List.
>Уже
И как мне []string преобразовать в []Yoba в функциональном стиле?
>>772627
>А у вас долбоебы сделали частью языка хэштаблицу, это же уровень php
Аутистам у кого Го первый язык, это не понять.
> Слайс аллоцирует в куче массив, а на стеке указатели на массив, длину и сегмент. Джава или Шарпе будет делать ровно то же самое, только структура указатели на массив, длину и сегмент будет тоже аллоцирована на стеке, что позволяет не ебаться с
ну вообще-то слайс и на стеке может быть аллоцирован полностью, включая внутренний массив, если он не убегает и ты подходящий размер укажешь.
Вкатываюсь в го, синтакс более менее освоил
Сейчас начал делать "пет проект". Фантазии нет, делаю абсолютно бесполезную хуйню
Цимес в том, что в моём проекте на Go буквально 40 строк, остальное делает JS. Это вообще норм или рекрутеры скажут что с такими приколами чтобы шёл на js разраба? Ещё планирую прикруть базы данных, но там тоже не сильно сложно
>Ещё планирую прикруть базы данных, но там тоже не сильно сложно
Обязательно прикручивай, иначе нахуя тебе вообще бекенд?
Чтобы было больше, делай не с гормами, а с чистым sql
Тем более что в проде зачастую так оно и происходит
Еще какой нить брокер подключи, например rmq, так же можешь еще подрубить эластик серч.
Сейм стори, тоже вкатываюсь, один сервис почти допилил, планирую еще парочку и интеграцию между ними сделать по rest и черезь очередь, в сумме должно норм быть.
В go правда большинсто проектов не использует ORM?
Имел опыт в джаве с этим самым хибернейтом, так и не проникся философией ORM. Чтобы написать, что-то чуть сложнее круда приходится все равно писать sql только через обертки orm-мовские и еще проблема n+1 из коробки. В го с orm такая же история?
А почему на джуна? В одном из прошлых тредов советовали перекатываться на мидла сразу с других языков. Или ты без опыта?
Без опыта и не профильное образование учитель музыки. Сейчас учусь заочно на программиста параллельно совмещая с работой и заодно готовлюсь к собесам, если меня на них ещё позовут...
>учитель музыки
Уроки на фортепьяно даёшь?
Мне бы не помешал ментор типа на одно занятие в неделю-две
А зачем из творческой сферы ты идешь в унылое программирование, где придется по 12 часов сидеть за ПК и все свободное время так же заниматься программированием?
Подумай
>>774116
Таки и в C#/Java эскейп анализ тоже есть, и JIT тоже может на стеке аллоцировать. Просто ты мудило, не можешь в контекст.
>10 раз подумаешь, а стоит ли аппендить в этот слайс или создать новую копию.
Подразумевает, что слайс пробрасывается куда-то наружу, явно за пределы эскейп анализа.
Твоя мать грязная тупая шлюха. Высрал тейк, обосрабся. Что-то говорит про контактст. Иди дальше на днище работу джейсоны кидать.й
Для особо тупых:
Одна из распространенных жалоб на Go заключается в том, что обработка ошибок слишком многословна. Это абсолютно верно; каждый раз, когда вы видите, что функция возвращает ошибку, вы должны проверить, является ли ошибка нулевой, и правильно ее обработать. Языки, которые используют исключения для обработки условий ошибок, не делают явную проверку ошибок, что часто приводит к хрупким программам, которые плохо справляются с обработкой ошибок. Делая ошибки настолько заметными, Go побуждает разработчиков поступать правильно и создавать более надежные программы.
В результате чего имеем всякие MustCompile() и сранье в аутпут при ошибках в шаблоне sprintf.
Насчёт должен обработать, у Джавы есть checked exception. И как показала практика - говно идея, только засирает код. Проще на верхнем уровне ловить панику/эксепшены и писать их в лог.
Ваше мнение очень важно для нас
Собственно обработка check exception и есть тот самый err != nil
Ошибки "не check" ловится могут на самом верхнем уровне без каких-либо дополнительных усилий, т.е. это и есть своего рода паника.
Я бы не сазал, что явные экеспшены как-то засирают код, другое дело, что конструкции для ловли могут побудить использовать их как условные операторы для разруливания веток кода, что не есть хорошо. Кмк, в Го как раз решена эта проблема, ловишь в defer recover и выполнение на этом функции завершвается в любом случае или в if err != nil, где явно делаешь возврат.где пишешь простыню с резервным сценарием
>и ни слова об эскейпе со стека в цитате. что подразумевается? куда наружу?
Очевидно что со слайсом который создан внутри метода и используется только внутри метода не возникает вопросов
>а стоит ли аппендить в этот слайс или создать новую копию
Речь явно идет про слайс который или получен снаружи, или прокидывается куда-то внутрь и непонятно что там с ним дальше будет.
>Собственно обработка check exception и есть тот самый err != nil
Только в Джаве можно один раз написать throws ZalupaException, а в Го каждый раз ебаться с
if err != nil {
return nil, err
}
>Кмк, в Го как раз решена эта проблема, ловишь в defer recover и выполнение на этом функции завершвается в любом случае или в if err != nil, где явно делаешь возврат.
panic-recover это и есть throw-catch в чистом виде. Более того его сами авторы Го используют его именно таким образом.
>каждый раз ебаться с
if err != nil {
return nil, err
кидай панику, если уверен, что ошибка на самый вверх должна пойти и с жизнью не совместима
Иначе ты все равно будешь писать if err != nil, только используя try catch
>Только в Джаве можно один раз написать throws ZalupaException, а в Го каждый раз ебаться с
да не обязательно. для всех функций с ошибками тупо скипаешь ошибку v, _ := zalupa() и когда-нибудь паникнешь. ну и в мейне просто такой же дефер на всё-всё как в твоей джаве))
480x534, 1:30
а что
а что если
...если бы было так что
а что если... если бы было так что когда пишешь v, _ = ... в кейсах когда err != nil, то это бы приводило к панике?
Лучше бы приводило к возврату ошибки, если функция её возвращает, и к панике если нет. И пустой идентификатор уже используется, лучше новый токен взять, например знак вопроса.
Осталось только придумать как добавлять контекст в таком случае
>кидай панику, если уверен, что ошибка на самый вверх должна пойти и с жизнью не совместима
Увы и ах, код-ревью не пройдет. Паниковать можно только в ситуациях инициализации на старте и тестах. В нормальном режиме паниковать нельзя. Пример их жизни, парсим строку регуляркой \d+, потом ее Atoi в число. Понятно что не должно быть ошибки, но тем не менее код-ревью завернули. Нехер паниковать в прод коде.
>>777877
>да не обязательно. для всех функций с ошибками тупо скипаешь ошибку v, _ := zalupa() и когда-нибудь паникнешь. ну и в мейне просто такой же дефер на всё-всё как в твоей джаве))
В джаве можно ловить ошибку, а потом ее тупо перебрасывать с сохранением стектрейса, в Го - хуй вам. Бросай новый и ебись с логированием старого стектрейса. В фреймворках у тебя нет майна, есть минимальный контроль над обработкой ошибок.
>>777855
>>777877
Это все к чему. Говей это ебстись с if err != nil { любой другой выебон с panic-recover создает проблемы с поддержкой кода.
>>777999
С одной стороны да, можно уменьшить боейлерплейт, а с другой будет отсутствовать дополнительная ишва. Напримиер ты в 3-х местах ты читаешь из базы и у тебя появляется DB: syntax error, как понять где?
>Увы и ах, код-ревью не пройдет.
Весьма странно
В том же effective go приводится пример когда с паникой прокидывается ошибка с кастомнын типом (аля MyCustomErr extends Runtime Exception)
В defer получаешь из recover ошибку и чекаешь тип, если кастомный, то обрабатываешь, если нет, т опаникуешь дальше
https://go.dev/doc/effective_go#errors
>В том же 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.
У нас тоже можно паниковать в ините если критичная проблема, а вот панику в методе библиотеки мне завернули, хотя по идее она и не должна в нормальной ситуации произойти.
Может это все не говей, но в идейке было удобно, когда онасама клепала заглушки методов.
борьбы
Есть почти всё, но реализовано так что куча кода на ровном месте.
Нет конструкторов, поэтому приходится делать тип приватным, объявлять интерфейс включая все геттеры/сеттеры hello Java my old friend и писать New() метод.
На уровне языка нельзя сказать, что тип реализует интерфейс, надо костылить через присваивание.
Нет иммутабельных данных, так что вся надежда на сознательность вызывающего.
Нет нормального наследования, создать базовый класс и чтобы кому надо расширял его нельзя.
>Нет конструкторов, поэтому приходится делать тип приватным, объявлять интерфейс включая все геттеры/сеттеры
кринж
>На уровне языка нельзя сказать, что тип реализует интерфейс, надо костылить через присваивание.
зачем?
>Нет нормального наследования, создать базовый класс и чтобы кому надо расширял его нельзя.
так это плюс
А зачем го вообще нужен? Думал для бэка а на деле он чуть ли не для операционок используется
Тогда следующий резонный вопрос. Почему у маскота голанга вместо глаз сиськи?
Как вы пишите интеграционные тесты для репок?
Используете sqlite или поднимаете локальный инстанс целевой базенки?
А схемы БД чем мигрируете?
>Используете sqlite или поднимаете локальный инстанс целевой базенки?
в ci поднимается постгрес в докере, накатываются миграции, и тесты работают с этой базой. для локальных тестов - аналогично, только в миникубе.
>А схемы БД чем мигрируете?
хз, какой-то отдельный контейнер есть, который накатывает всё.
Всем привет! Какой сейчас стандартный стэк на Go для бэкенда?
Что брать как фреймворк, какую ORM, структура проекта итд
Хочу вкатиться с Python/FastAPI/DRF
Ну там для примитивных крудов, типа накидал структуру и прикрутил к ней интерфейс, добавил теги или передел в метод хз как у вас там и готово, работаешь со структурой как с таблицей. Или в го такое не актуально и тупо везде голые sql запросы?
Мимо
Сам занимаюсь бч разработкой на Solidity два года, хочу расширять стек. В бч-сфере преимущественно вижу разработку бэка на ноде, либо разработку бч на той же гошке. Есть, конечно, и разработка на расте, но там смертью пахнет.
Ну, гипотетически я какой-то опыт могу наработать в рамках компании, но у нас основной стек всё таки ноде.жс
Сам только вкатываюсь, но во что получается по результатам ресерча:
Sql - PostgreSql
No-sql, кэши - redis, MongoDB
Транспорт - kafka, rabbitMQ, grpc
web-фрейворк - gin
Тестирование - пакеты testify, тулза gomock
Контейнеры, облачные сервисы - docker, kuber, aws
Остальное так понимаю покрывается стандартной либой + пакетами от третьих лиц
И чем это отличается от питухона/сисярпа/етц, кроме фреймворка и тестов, заточенных под конкретный язык?
Тем что SQL нужно зачастую руками писать + ошибки руками обрабатывать. В общем то и всё
Если нет высоких нагрузок, то ничего лучше питона еще не придумали.
А так - компилируемость, статическая типизация, удобная работа с многопоточностью, отсутствие GIL.
А в питухоне не нужно скл руками писать, если алхимию не хочется тянуть? Или городить свои экспешн_хэндлеры на каждый сетевой пук?
Mkay?
Джангодебил, ты совсем упоролся?
А был бы суслик он бы неплохо так питона порвал
до этого был только php и nodejs
что ты хочешь получить? ну вот мне язык нравится и еще зп платят. стоит ли не стоит?
ну допустим если перекатиться с php+laravel на го то я ничо не проебу?? Деняк побольше дадут?
У них разные ниши, не совсем правильно сравнивать. Но если так, то го проще намного для разработчика. Ну и он всё же ближе к вебу, а раст больше в системщину
>Ок. Где больше платят, в системщине или веб??
Навинающие в веб больше делают. Но топовые специалисты ценятся в системном программировании.
Хорошо, спасибо <3
>топовые специалисты ценятся в системном программировании
Следует добавить что для этой хуйни особый склад ума нужен. У меня в кругу буквально пара человек этим занимается, один из них дохуя востребованный спец, года в 23 в Японию в соляного перекатился вообще без проблем.
ну гошка это по сути новая пыха. юзкейсов больше, но 99% вакух будет по сути тот же бэкенд.
идти в раст это все равно то же, что уходить в плюсы - графика, системка и те штуки, которые раньше писались на плюсах/сях, чтобы було быстро. так что можешь вернуться на 15 лет назад и подумать куда ты хочешь.
https://leetcode.com/problems/contains-duplicate/solutions/2552285/go-multiple-solutions-in-go-golang/
Никакой хитрости нет, у массива длины n самый большой индекс это n-1, т.к. первый индекс - 0
за тем же, зачем j := i+1 и почему сложность (n-1) * (n-1)
>Может кто объяснить зачем тут len-1? чет слышал что в гошке есть какая-то хитрость с жтим.
Нет никакой хитрости в Еошке, это просто алгоритм такой.
Пусть у тебя есть слайс [0, 1, 2, 3, 4] ты берешь первый цикл по [0, 1, 2, 3], а второй по первый + 1.
как-то грустно, что только пыха
Но вроде бы веб/микросервисы в современном мире - это и есть 99% вакух, вне зависимости от языка?
Еще криптостартапы на гошке пилят
Да понятно что ты там пытался сказать, не мучайся
```
package kata
func StringToArray(str string) []string {
arr := []string{}
for i := 0; i < len(str); i++ {
if str != " " {
arr = append(arr, string(str))
}
}
return arr
}
./solution.go:7:22: invalid operation: str != " " (mismatched types byte and untyped string)
```
ебани str != nil вместо str != ""
Вот что заставляет людей писать "err" вместо "error"?
Ну хорошо, а что заставляет людей писать "var"? Страх, что код не скомпилируется?
Походу парсер сожрал скобки, я понял в чем проблема.
Ты неправильно работаешь со строками. Го это тебе не Джава, тут свои оригинальные решения. Строка это не последовательность символов, строка это последовательность байт, которые являются строкой в UTF-8. Соответсвенно str{n} скобки квадратные, а не фигурные это N-ый байт, а не символ. Работать с символами надо по другому.
https://go.dev/play/p/3-PsDpCSDJf
>Ну хорошо, а что заставляет людей писать "var"? Страх, что код не скомпилируется?
То что это объявление на уровне пакета. Ты вообще местный йумор не оттдупляешь.
Как такие задачи решать, если не знал про всякий utf8 encoding и так далее? Смотреть ответ, а потом аналогичные решать самому?
Какая у тебя зп?
>Как такие задачи решать, если не знал про всякий 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.
>>789815
>Какая у тебя зп?
Норм.
Смех смехом, но в зависимости от того использовал ты var для объявления переменной внутри функции или сразу присвоил значение может зависит, где именно выделить память, в стеке или на куче. Это конечно байтоебство и душные кишочки, но довольно интересно, т.к. по сути можно писать не читаемый говнокод, который будет оптимальнее работать
> но в зависимости от того использовал ты var для объявления переменной внутри функции или сразу присвоил значение может зависит, где именно выделить память, в стеке или на куче
примеры будут?
https://youtu.be/kClQ7rM5uBY?t=4882
лень писать, скину на конкретный кусок, в целом видео познавательное
Смотри моковые собесы по го, на русском языке контента часов на 10, гугли ответы на вопросы или просто старайся запомнить.
Олсо, как получил приглашение на собес без коммерческого опыта в го и петов?
Спасибо. Не знал про такой контент.
Перевожусь в другую команду внутри компании. Тот же почти продукт только теперь компоненты на го есть. Нашу команду продали партнёрам, а я уходить из компании не хочу. Поэтому собес такой внезапный. Сам в го не хотел
Нет
Ну тащемта первое по нулям если я правильно помню, что конст сайз арреи в гошке не поинтерами идут, пользуюсь хуй пойми да раз в год в лучшем случае, второе будет 012, но только если ты длину вручную модифнешь, аля slice[:3]
Питон, ботики всякие максимум писал
1. Как сказали в комментах: автор очень косноязычный и некоторые вещи понять нереально. Отношения интерфейс-структура, он очень криво объяснил, на середине отвлекся и часть не договорил. На тему почему часть отношение интрефейс-интрефейс всегда идут в динамике, вообще что-то невнятное промычал что мы типа не всегда это можем знать. А вот вторая часть про аллокации, там намного четче и бодрее. Сразу видно что первую часть он пересказывает, то что читал у других, а второй сам занимался.
2. Это не данность, как он сам сказал все зависит от компилятора - по мере улучшения анализа поведение может меняться.
3. Он вообще не говорил про стиль декларирования := vs var, он говорил про ссылка vs не ссылка, и как влияет разная инициализация полей b.data = new(byte) vs box{data: new(byte)}. Просто он реально не умеет делать доклады и даже простые вещи не может объяснить нормально.
Вообще всю эту хуету можно и самому проверить и убедиться что := vs var влияет ссылка/не ссылка и как потом с этими данными обращаются. https://pastebin.com/jUzaqzRK
Но двощеры предпочтут пересказывать друг-другу одни и те же легенды
> и как влияет разная инициализация полей b.data = new(byte) vs box{data: new(byte)}
Никак. Буквально одно и тоже.
>>790682
Какой же ты хлебушек. Чел час распинался про эскейп анализ, когда он работает, а когда нет. Потом приходишь ты и специально возвращаешь ссылку на объект, чтобы компилятор на 100% был уверен, что ссылка утекает. Речь шла именно про случай когда объект используется только внутри метода.
https://godbolt.org/z/YEnxM344c
Вот тут как раз видно, что Dumber1_1 и Dumber1_2 вызывается runtime.newobject() аллокация в куче, а в Dumber2_1 - нет аллокация на стеке.
> а в Dumber2_1 - нет аллокация на стеке.
В гошке немного не такие стеки, как принято в нормальныз языках, ну так, к слову.
https://github.com/golang/go/blob/6fe976545d646a3f076a84a7ca22be63df8da718/src/runtime/stkframe.go#L264
А есть ссылки на первоисточники? Не помню, чтобы в спеке разжевывалось отношение интерфейс-интерфейс
Речь о том, как это технически реализовывается, а не поведение. Что будет если есть два интерфейса в разных пакетах, но с одними и теми же методами.
У меня есть друг с IQ = 150, и даже ему тяжеловато писать на расте
https://github.com/teh-cmc/go-internals/blob/master/chapter2_interfaces/README.md#anatomy-of-an-interface
Но там не очень подробно. Если прям совсем подробно надо, то читай исходники. Благо они в основном на го.
В жаве есть примитивные типы. А сколько вальгалу завезут и не ссылочных типов станет ещё больше.
Спасибо
А если апи не рест и всегда нужно возвращать какое-то значение?
Как во втором случае отличить zero value от не найденного значения?
Например есть структура с тремя int, как отличить 0,0,0 - значение найденное в базе, от такого же но ненайденнго с zerovalue?
Не нашел - вернул код 404
ФСЕ
>Например есть структура с тремя int, как отличить 0,0,0 - значение найденное в базе, от такого же но ненайденнго с zerovalue
Ты буквально сам же предложил решение
Т.е. в случае nil указатель маршалится в {} или somefield: null?
Чтобы клиент явно мог отличить nil от zero value
В случае если ничего не найдено ты не обязан даже null возвращать. Просто возвращаешь респонс с кодом 404 и без body
Разные виды респонсов для разных кодов
>>791537
Спасибо за ответы и прости за духоту, но спрошу таки, как грамотно вернуть ошибку контроллеру/юзкейсу в случае если не найдена строчка
nil, nil в случае, если не найдена запись норм вариант?
Можно было бы и просто nil, err возвращать, но тогда в контроллере явная зависимость от пакета sql по сути не нужная
чел, открой исходники. row.Err чекать даже не надо, оно при scan делается.
плюс у тебя горутина утекает если ты выйдешь без scan
криптостартаперы на месте?
Чувак из Нигерии и хочет релоцироваться в штаты.
Нигер...
Хорошо, что я свичер из других языков
Кстати, насчёт свитчеров.
Я понимаю вопрос дебильный, но мож у кого-то просто опыт схожий был.
В общем ща я получаю 2к. Если свитчнусь в го, насколько можно просесть по зп, при условии что я не буду притворяться, что имею коммерческий опыт в го?
Просто прикидываю свои силы, можно ли уже сейчас пробоваться, или надо ещё поднатаскаться чтобы за своего пройти. Хотя с другой стороны я могу просто походить на собеседования и выяснить.
Двачую вопрос, насколько реально свичнуться без опыта в Го?
Тричую
544x960, 0:05
ну просядешь если пойдешь проходить собес на гошке и нихуя знать не будешь.
если будешь на своем языке собеситься то шансов больше))
Не об этом вопрос.
Вопрос будут ли пытаться интенсивно пытаться прогнуть по зп ниже 2к если увидят отсутствие опыта в го, даже если на интервью норм справляешься.
Но можешь не отвечать, я уже понял что никто этого не знает.
Зависит от твоего опыта. Меня брали без опыта в Го и на большую зарплату. Начиная с некого уровня предполагается, что ты способен выучить язык по ходу.
ну я просто один из кейсов описал, который может повлиять. у бэков есть выбор собеситься на гошке или пыхе/паре других языков. если выберешь проходить на гошке, но будешь хуево отвечать, ты потеряешь шанс показать что ты сенёр в пыхе и тебе дадут хуевую оценку. и возможно не найдется команд, которые тебя решат взять.
>я уже понял что никто этого не знает
очевидно, т.к. от компании к компании по-разному.
у нас пыхеров без опыта в гошке часто видно на собесах. сомневаюсь, что их намеренно просаживают - кандидаты тогда просто не будут офер принимать.
Ну если ситуация такая, то проще напиздеть
На всё похуй.
На текущую работу, на следующую.
Лучше бы меня автобус переехал нахуй
И как оно? Проекты интересные, сильно дрочат за производительность из-за хайлоада?
Какому дауну эта хуйня вообще в голову пришла и сколько он перед этим стучался головой об стену?
Что конкретно тебе не нравится? Плохой редактор, неправильно подсвечивающий код?
Но шоб даже не компилировалось на уровне языка - это полный пиздец, нет? Почему какого то петуха волнуют мои базовые привычки?
Можешь юзать индентацию, просто открывающая { должна быть в той же строке, что main(). Вероятно, это как-то связано с избавлением от semicolon hell.
Вроде нормально go run main.go отрабатывает. А на гайдлайн тебе похуй, сам же выше это написал.
Гайдлайн я имею ввиду на уровне языка. Как раз да, наверное из-за точек с запятой так делать и нельзя, ору нахуй челам не хватило извилин запилить адекватный парсер исходников и они забанили тупо кодстайл.
Че там у тебя компилируется - я хз, ты может провтыкал автоформатирование или еще что?
Ну, мне тоже нравится фигурная скобка с новой строки, потому что так естественным образом отделяется практически пустой строкой название функции от первой строки ее кода. В старых сях такой стиль был. Ну а в современных крестах уже в одну строку пишут. Может голэнгщики просто отдельное правило для парсера не хотели добавлять ради этого, тут стоит только начать, и у тебя уже через некоторое время будет дохуя отдельных правил.
this
В го команды отделяются семиколоном, просто он не явно подразумевается в определенных случаях при переводе строки, в спеке есть описание.
> 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!
Извините, я пишу на Го, поэтому немного несдержан.
Возвращать сам объект из метода [пере]изобрели в jQuery, то есть в жопаскрипте, чтобы можно было нахуячить цепочку object.method1().method2().method3(). Это решается и другими методами. Хотя я вот сам в крестах такое часто использую, чтобы превратить программирование на крестах в программирование на жопаскрипте, на что некоторые крестолухи ругаются, да и хуй с ними.
>Проекты интересные
иногда да, иногда простенькие. каждую правку можно самому пощупать и понять как оно на пользователей влияет. если есть крутые идеи, то ты как разработчик можешь их сам тоже предложить.
>сильно дрочат за производительность из-за хайлоада
от команды к команде, не у всех супер-нагруженные сервисы. на уровне кода обычно байтоебства нет. максимум попросят слайс преаллоцировать, последовательные сетевые походы переделать на параллельные, ну и индексы в бд конечно же.
по большой части надо чтобы архитектура скалировалась и твоя хуйня не стала ботлнеком/не валила флоу пользователя - грейсфул деградировала, асинхронно выполнялась, когда возможно, и т.п. Нагрузку считать, уведомлять смежные команды о планируемом росте рпм, проводить НТ - это приходится.
>Возвращать сам объект из метода [пере]изобрели в jQuery, то есть в жопаскрипте, чтобы можно было нахуячить цепочку
Чееееел. Конкретно для стринг билдера этот шаблон с возвратом this использовался и джавой и шарпом, задолго до жс.
>>797777
Какой же охуенный язык Го! Делаем у метода ебанутую сигнатуру, чтобы она соответствовала какому-то интерфейсу в другом пакете. При этом в коде вообще никаких упоминаний об этом интерфейсе. Ну заебись же!
Если разработчик хочет чтобы тип реализовывал какой-то интерфейс - пусть явно это напишет. А не ебется с
var _ Interface = &Struct{}
и пользователям мозги не ебет а прокатит Foo в качестве Bar?
Нахуй надо тащить duck typing в статический язык - решительно непонятно. Это порождает кучу сложностей в рантайме, типа >>789881 часть про то как тип мапиться на интерфейс в рантайме, это создает проблемы с пониманием API нахуй надо a nil error возвращать?. Оставте duck typing динамодристне, а в статическом языке делайте статические реализации интерфейсов.
Будучи на даче, обнаружилось, что go build без интернета совсем не работает (выдаёт ошибки подключения к сети). То есть ни одну программу невозможно собрать оффлайн. И это несмотря на то, что все зависимости уже установлены и есть в кэше.
ЗЫ У меня последняя версия гошного компилятора.
Ты правда думал, что гугл позволит тебе это сделать без отправки на их сервера телеметрии?
Не воспроизводиться, у меня билд проходит и без интернета. С какими флагами запускаешь и что выводит? Пробовал go mod vendor?
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.
>И это несмотря на то, что все зависимости уже установлены и есть в кэше.
ты уверен, что они все правильных коммитов, которые у тебя в go.sum?
>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() на дженериках? Пока не научились ими пользоваться?
>на дженериках
Отправляешь туда разные типы и comparable интерфейса, твои действия? А вот с built-in такое можно
Какой телеметрии?
>>799711
Как воспроизвести:
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 уже и не сделать!
>Отправляешь туда разные типы и comparable интерфейса, твои действия?
Ты вообще программировать то умеешь? https://go.dev/play/p/z0DI3dyeWJt если бы был встроенный тип ordered было бы компактней
И не comparable, а ordered. comparable это только равенство, но не порядок.
>в который помещаем только hello.go, и пробуем его собрать
ну скопируй go.mod и go.sum и положи рядом и всё
Гениально! А зачем вообще было создавать отдельный каталог и помещать туда hello.go, если можно было остаться в том же? Даже перекомпилировать не надо, бинарник-то уже собран!
Это был пример для гарантированного воспроизведения, дурында!
Для тупых: в реальности вместо hello.go может быть другая прога, хотя и включающая те же зависимости (+ другие тоже уже скачанные), но для которой нет готовых go.mod|sum.
чел, там всего лишь надо в go.mod указать версии пакетов и оно всё из кеша подтянется. можешь хоть из нескольких разных go.mod накопипастить реквайры. почему тебе go mod tidy не заполняет go.mod последними локальными версиями? ну типа да, могли бы заполнять, но вообще юзкейс редкий и всем похуй. можешь на гитхабе предложить.
Не соглашусь. Есть множество случаев, когда может понадобиться скомпилировать программу без интернета.
Кстати, go нужно банить на хостингах за такое насилование сети на каждый чих вместо кэша. Ладно, сейчас на go мало кто пишет и компилит, а если он вдруг станет по-настоящему популярным? Это же ддос-атака на ресурсы типа гитхаба и бессмысленный жор кучи трафика.
>Есть множество случаев, когда может понадобиться скомпилировать программу без интернета
И у тебя есть все зависимости для этого в локальном кеше И эту программу тебе поставили без go.mod И ничего в ней не завендорили
зеркала есть же, в крупняках по крайней мере
Не понимаю прикол таких вещей как go kit и go micro. Пытался выкурить, но так и не понял, в чем прикол. Антон, расскажи, юзаешь ли ты это и для чего?
Еще через жопу у меня получается трейсить запросы, и особенно логировать trace ID и span id. Антон, расскажи, юзаете ли вы трейсинг и так ли он необходим
Ты видимо с кубером ещё не работал, раз такие вопросы задаёшь. В гошке вся фишка в том, что ты не только бэк пишешь, но ещё и девопсом на 0.75 ставки будешь работать. Морально готовься.
не юзаю. ну go-kit где-то там глубоко в зависимостях видел. тулинг-логирование-трейсы-метрики-хуемое у нас отдельная команда делает - частично самописные вещи, частично обертки под уже готовые (потом там что-то допиливает/меняет реализацию под капотом и т.п.). мы просто юзаем то что они предоставляют.
трейсинг юзаю, т.к. у нас дохуя сервисов и чтобы понять что вообще происходит при вызове какой-то ручки это быстрее, чем лазить по коду нескольких реп.
Говноед будет кукарекать о стиле, фу блядь
В автоформатере го излишни лишь еубищные дедовские выравнивания нахуй не нужные
Че ты расквакалась пидорашка зумерская? Нахуй тебе это скобка после выражения? Байты экономишь?
Такой код стайл самый адекватный, сразу +100 к читаемости потому что всё четко видно по блокам и что к чему относится. Жаль что зумерки этого не понимают, ведь они ничего кроме кода своих лаб не видели даже
Но форсить его на уровне компилятора, догадалась только в го. Если уж так руки чешутся, то сделали бы в релиз режиме. А то дебажишь код, закомментировал строчку, и переменная не используется иди нахуй.
Майкрософтомакака, ты? У тебя мозгов не хватает распознать блок, который начинается не скобкой, а ключевым словом? Я хочу видеть максимальное количество строк кода за раз чтобы не скролить постоянно его туда-сюда. Люблю смотреть как вы пролистываете ваш код с сеттерами и геттерами из одной строки, который превращаются в ёбаную гармошку на весь экран из-за скобок.
Другой анон.
Ты ведь в курсе что в нормальных языках скобку на одно выражение можно и не ставить? Ах да, ты же голенговая одебилевшая обезьяна
А почему 3, магический ты человек? Бери выше, любая параша лучше вашего говна где программисту даже кодстайл выбрать нельзя. Странно еще что вам на нем писать разрешают
пизда твоей мамки
Но я серьезнее
>программисту даже кодстайл выбрать нельзя
программисту вообще нахуй лишнего выбора нельзя давать. пусть пишет то, что нужно, а не всякой левой хуйней занимается.
База. Как вообще код этих пидарасов ревьюить, если у них ещё и кодстайл отличаться будет. Хотите творчества - съебывайте из сферы нахуй.
Может кто-то пояснить за эту хуйню? Я так понял, что прикол в том, что просто хочется делать встроенные в язык итераторы, а если делать их тупо на каналах без поддержки yield'ов то это будет неэффективно
>База. Как вообще код этих пидарасов ревьюить, если у них ещё и кодстайл отличаться будет.
Как во всех нормальных языках делают. Компания выбирает себе кодстайл, пишеи гайдлайны, в CI/CD вставляет запуск верифаера кодстайла. Если компании похй - то все пишут как хотят. Уж точно это не Пайково собачье дело.
>в гошных кодстайлах про скобочки не пишут
Иди нахуй унтерменш! Ты вообще не оттупляешь.
https://go.dev/doc/faq#semicolons
Чтобы модно молодежно, без привязки к энтерпрайзу и финтеху
ну если ты под словом кодстайл понимаешь синтаксис то вопросов нет, намыль веревку и скворечник свой повесь
Шарпомакака, только у вас так по ебнутому переносят скобки, потому что индусам в ms построчно платят. Во всех других языках code style примерно как в гошке и линтеры работают примерно также
Я не шарпист, ты обосрался олигофреновая обезьяна
>ну если ты под словом кодстайл понимаешь синтаксис то вопросов нет, намыль веревку и скворечник свой повесь
Дебил, весь мир по кодстайлом понимает в том числе и расстановку скобок. Иди лучше в мак сортиры мыть.
Авито-анон, поясни, плс, за направления в авито для гошников?, какие перспективные, какие интересные. Видел вакансии в области безопасности в том числе, там интересные проекты? Или самый движ в продуктовой разработке?
челик, кодстайл это всё то, что ты можешь менять. спек языка это не кодстайл. синтаксис языка это не кодстайл. реализация компилятора это не кодстайл.
Установил GOOS=android и GOARCH=arm
Пыфтаюсь собрать и получаю
# runtime/cgo
gcc.exe: error: unrecognized command-line option '-marm'; did you mean '-mabm'?
В GOGCCFLAGS при этом вижу этот -marm но GOGCCFLAGS не меняется по документации. Так как изменить параметр для компилятора? Это делается на стороне Go, на стороне gcc, надо менять какой-то другой параметр?
Посмотри в сторону gomobile
>челик, кодстайл это всё то, что ты можешь менять. спек языка это не кодстайл. синтаксис языка это не кодстайл. реализация компилятора это не кодстайл.
Мне ебучий компилятор не дает спокойно строчку закоментировать, отказывается компилировать потому что переменная/пакет не используется. Хорошо хоть переменные пока дают называть как хочешь. Но чувствую это поправят в новом релизе.
я в продукте, насчет безопасников не очень много слышно - обычно то, что они sast/dastы пилят, ну и с аудитами помогают.
максимум движа - в продукте, там всякие аб-тесты, новые запуски и т.п. но я думаю в командах со внутренними продуктами тоже полно интересных задач. энивей можно трансфернуться в другую команду, если поймешь, что тебе не очень и там будет вакуха.
Там же не будет сегфолта, просто со временем операционная система прибъет процесс из-за ООМ.
После возврата из функции стекфрейм считается неиспользуемым, дальше возможны варианты. В Го стек горутин выделяется на куче, после завершения горутины память могут вернуть ОС, тогда будет сегфолт в текущей реализации, Го никогда не возвращает память ОС. В стек может записать новый вызов функции, сегфолта не будет, но вместо данны будет мусор наиболее вероятный сценарий.
Отличный вопрос, рекомендую почитать нигде, ещё можно нигде и в конце обычно всем советуют нигде.
Дельных статей почти нет, на русском просто нет, читай исходники, слушай подкасты гошников, они иногда этой темы касаются. Смотри видосы с конференций по теме, но там зачастую джуниор уровень.
Тащемта про наследование он прав. На предыдущей галере большую часть задач наследования решали композированием функционала.
Golang - буквально язык программирования Google. Он разрабатывался для решения внутренних задач, и, очевидно, был написан под местный кодстайл.
Да норм язык, многопотчку заебись сделоли, каналы дадены - можно любое канкаренси апи реализовать, еба
обнял
>Golang - буквально язык программирования Google. Он разрабатывался для решения внутренних задач, и, очевидно, был написан под местный кодстайл.
В Гугле половина вопросов по кодстайлу решается presubmit check, но другую засунули аж в компилятор. Почему нельзя было всё так сделать?
Это очень популярный миф, а точнее пиздеж. Вклад гугла в го там на уровне "мы платили деньги чувакам типа Раса Кокса, которые фулл тайм разрабатывают ЯПы". Целей сделать "язык гугла" у них не было и нет. Хуйня про "нам нужен был язык для дебилов" и прочее тоже очень сильно вырвана из контекста и слов одного конкретного человека.
Более того, ты можешь пойти к любому сотруднику гугла и спросить, как там у них дела и они тебе ответят, что с го у них пиздец и дикий говнокод. И да, половина гугла написана на джаве, половина на плюсах - а оставшиеся проценты делят все прочие языки, включая го.
Даже убер, насколько бы он мне не нравился - намного более "гошная" контора, которая написала тонну софта и которая действительно в промышленных масштабах разрабатывает и поддерживает сервисы на го. хотя их код конечно ну такое, там явно джава головного мозга, не советую
а мне понравился их unber fx. Елси его внедририть на весь отдел, то получается очень простой и шаблонный код.
>Вклад гугла в го там на уровне "мы платили деньги чувакам типа Раса Кокса, которые фулл тайм разрабатывают ЯПы".
Кто девушку ужинает, тот её и танцует. Да Го не внутренний язык Гугла, но он очень сильно заточен под нужды SRE.
>ты можешь пойти к любому сотруднику гугла и спросить, как там у них дела и они тебе ответят, что с го у них пиздец и дикий говнокод.
Код сам по себе нормально написан, проблема в том что постоянно меняются приоритеты. Система писалась для одной задачи, пришло начальство и сказало, что теперь ваша система будет ещё и задачу Б делать, срок вам квартал. Понятно, что архитектура получается не очень. Но сам код нормальный насколько возможно для го.
Добавлю, что работаю в говноконторе без тестировщиков, аналитиков и прочих. Делаю приложения для железа по BLE, USB, MIDI. Всё нетипичное, может поэтому я здесь так страдаю, не знаю.
100% инфу не дам, т.к. сам пока пытаюсь свичнуться, из опыта собесов и прошлого опыта в энтерпрайзе могу сопоставить, в целом кажется +- один и тот же стек, во многих солидных конторах над конкретными технологиями свои обертки, если будешь писать микросервисы, а скорее всего так и будет, то там все же по шаблонам из шапки, на уровне самого приложения - чистая или гексогональная архитектура, ну UI не будет скорее всего, только если ты не фулл стек. SQL надо надрочить и понимать как БД работают. В целом шарить за бэк полезно, подходы не так чтобы меняются часто, типа пакетной обработки, брокеров сообщений, протоколов https, grpc.
Спасибо за ответ братан!
> Но сам код нормальный насколько возможно для го.
Да нихуя он там у них не нормальный, идиоматичностью и не пахнет. Нормально писать на го, нужно идти не в гугл, суровая правда жизни
>>809286
Это в лучшем случае лучшее из худшего. Куча магии, неочевидного поведения и хаков, чтобы эмулировать нормальные джавовые контейнеры. Для го такой подход чужд.
Но даже если и забыть про всё это - fx тупо плохо написан, я разбирался в их коде в своё время. Это крайне переусложненная надстройка над dig, с абстрактным графом абстрактных опций поверх абстрактного графа абстрактных опций. Авторов явно долго и методично били по голове самоучителем по Java 8. А потом ещё немного повозили лицом по какому-нибудь ООПшному сборнику типа паттернов GOF.
>Да нихуя он там у них не нормальный, идиоматичностью и не пахнет. Нормально писать на го, нужно идти не в гугл, суровая правда жизни
Ты там работаешь, чтобы так категорично утверждать? Может приведешь пару примеров не идеоматичного кода и гайдлайнов гугла?
надо было учить язык программирования html.
думаю ты увидишь все свои переносы, если нажмешь правкой кнопкой и сделаешь View Source
https://www.youtube.com/watch?v=V6lQG6d5LgU
https://github.com/evrone/go-clean-template
это как шаблон, что не мешает в него насрать своим говнокодом, пробуй
Бля, я для вката в это ваше программирование выбрал c++. А мне приятель говорил: "фу, старьё, выбирай модное - молодежное". Сейчас пытаюсь изучить GO, чтоб какую-то первую работу найти. Это просто пизда:
1) учебники либо для опытных программистов, либо для школьников. Этого вашего ебучего Донована можно с середины в любом направлении читать, пытался учиться по нему - упражнения в каждой главе как будто ты уже всю книгу осилил, периодически на середине какой-то темы бросается выражениями, которые не программист не поймет. С трудом понимаю что пишет, проводя параллели с c++, плюнул изучаю язык по хуйне для школьников. Базовой инфы никакой, пишет для тех, кто уже имеет опыт в пару лет как минимум.
2) ебусь второй день с ебучими пакетами, не могу заставить GO пользоваться моими пакетами из нужных мне папок. Какого хуя, спрашивается, вообще нужен был этот ебучий гемморой с GOPATH, примеры из учебников не работают, примеры из стаковерфлоу не работают, добрался до Go Modules, про который какая-то добрая душа где-то написала. Предчувствую ещё пару вёдер этого дерьма.
3) Онли пакеты с функциями и готовыми объектами. Я понимаю что макак типа меня надо снабжать готовыми решениями, чтобы сложнее было хуйни наворотить. Но в крестах я понимал что стоит за каждым объектом, за каждой функцией или хотя б в общем виде представлял. А тут набор кроликов из чёрных ящиков, вот тебе возвращаемые значения, а остальное тебя ебать не должно. Логика тут есть, только чувствуешь себя на тонком льду - не знаешь когда и где провалишься. А когда это таки случается - не понимаешь с чем это связано, как это исправлять и где вообще концы искать.
Короче я не понимаю что простого в GO, в крестах много информации, но всё гораздо проще и прозрачней. Баттхёрт излил - пойду дальше жрать кактус.
а поделишься ссылкой на Донавана или где купить pdf?
>добрался до Go Modules
ну там проще, пакетики загрузятся в нужную папку
>Онли пакеты с функциями и готовыми объектами.
юзай чатгопоту, он неплохо разжевывает моменты и экономит время на гугле, но чекай на всякий потом его ответы
> учебники либо для опытных программистов, либо для школьников
Учебники всегда непонятные, пока ты не начнёшь проекты делать сам.
>А тут набор кроликов из чёрных ящиков, вот тебе возвращаемые значения, а остальное тебя ебать не должно.
Ну ващет в го можно хоть в исходники самого компилятора залезть чтобы что-то посмотреть, тем более в исходники пакетов (если ты скачал эти исходники). Это ж не 1с.
Донован есть на рутрекере, я себе еще книжку купил 20-го года издания, правда судя по всему это все то же издание, отличий я, по крайней мере, не заметил.
Держи, братан. Поверхностный просмотр не показал мне, что эта книга чем-то отличается от русского издания 2020 года, которая у меня в бумаге лежит.
https://dropmefiles.com/pQucF
>>811386
В итоге ещё несколько часов баттхёрта, гугления, кучи созданных новых проектов и директорий - каким-то образом начало работать. Но знаете, что:
1) я не понимаю почему оно начало работать
2) я не понимаю почему оно не работало
Есть подозрение, что изменение произошло после того как я изменил с GO111MODULE = auto на GO111MODULE = on. При этом все старые директории, в которых я инициировал go.mod продолжают не работать. Короче, говна поел, потратил время в пустую, даже не разобрался.
>Есть подозрение, что изменение произошло после того как я изменил с 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
Это какой-то троллинг.
Кресты невозможно выучить и практически невозможно писать на них правильно, спроси у любого достаточно опытного программиста, не являющегося при этом фанатиком.
Кресты охренительно сложны даже на уровне стандартов, а ещё там на каждом шагу UB (гугли UBook, охуеешь оттого, насколько небезопасно в крестах делать что угодно) и ансейф на уровне стандартных библиотек.
Не от хорошей жизни появился раст, не от хорошей жизни появился го.
Я не буду спорить, потому что я сраный вкатун, а не программист. Возможно это заслуга хорошего учебника, я осваивал кресты по книге Стивена Пратта "Язык программирования C++". Каждый рассмотренный вопрос в этой книге мне понятен. Больше всего сложностей у меня было с указателями, а точнее когда начинались указатели на указатели на указатели, но даже это далось. Также мне лично относительно тяжело было понять обобщенное программирование из библиотеки STL после ООП. Абстрактные классы, виртуальные функции, шаблоны всех мастей, спецификации и другие вещи с иерархиями следуют определённым строгим внутренним правилам, поэтому всегда можно раскрутить весь клубок и прикинуть хуй к носу. Этим мне С++ и понравился - он пронизан определёнными глобальными принципами, которые дают тебе правильное направление в мышлении, либо просто автор учебника настолько хороший преподаватель. С тем что C++ более чувствителен к качеству программиста - я полностью согласен, так как ограничений он накладывает очень немного.
Поэтому мне сейчас Go кажется тяжёлым, так как на первый взгляд он выглядит просто как бессистемный набор каких-то решений.
Добавлю, что я осваивал только ванильный C++, весь цимес, на изучение которого жизни не хватит, находится в библиотеках.
>>812443
Поздравляю, ты только что разницу между коммерческим языком и пустым дрочем. Никто не читает код библиотек, и уж тем более крестовых кроме самих писателей этих библиотек и задротов-велосипедистов. Занятие абсолютно бессмысленное, во-первых, во-вторых, довольно сложное, потому что код плюсов, особенно stl и boost подобных библиотек - очень нетривиальны, требует не только разбирания логики, но и почему именно так написано а не иначе. В плюсах люди не реализуют свои идеи, они блять сидят и дрочат: а что блять там где то и как будет происходить если я напишу свою мысль вот так или эдак? Это абсолютно идиотское занятие. Но зато ты понимаешь как все происходит вон там, и после, правда что уже после после происходит как то не оч(
Я отчасти с тобой согласен, го действительно несколько бессистемен. В смысле, многие вопросы в нём или отданы на решение самому программисту (то есть, решаются разными либами), или язык содержит для них пару волшебных хаков.
Но при этом го сильно проще плюсов на концептуальном уровне, этих концепций на порядки меньше. По сути в го есть структуры, интерфейсы и функции, всё остальное - легкие надстроечки. В плюсах и прочих языках этого сильно больше, а ведь потом ещё и начинаются хаки, хаки хаков, хаки хаков хаков и тп. В результате к примеру в плюсах это приводит к тому, что программирование на языке превращается в метапрограммирование на темплейтах, где без поллитра не разберешся. Про арифметику указателей и триллион тонкостей с ними я вообще молчу.
При этом конкретно плюсы страшны тем, что во первых, там до черта вариантов сделать одно и то же немного по разному (какая-нибудь разница между 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.
Я отчасти с тобой согласен, го действительно несколько бессистемен. В смысле, многие вопросы в нём или отданы на решение самому программисту (то есть, решаются разными либами), или язык содержит для них пару волшебных хаков.
Но при этом го сильно проще плюсов на концептуальном уровне, этих концепций на порядки меньше. По сути в го есть структуры, интерфейсы и функции, всё остальное - легкие надстроечки. В плюсах и прочих языках этого сильно больше, а ведь потом ещё и начинаются хаки, хаки хаков, хаки хаков хаков и тп. В результате к примеру в плюсах это приводит к тому, что программирование на языке превращается в метапрограммирование на темплейтах, где без поллитра не разберешся. Про арифметику указателей и триллион тонкостей с ними я вообще молчу.
При этом конкретно плюсы страшны тем, что во первых, там до черта вариантов сделать одно и то же немного по разному (какая-нибудь разница между 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.
>2147483647 она вернет тебе false, так как a+1
О том, что числовые типы при переполнении изменяются циклически говорится то ли во второй, то ли в третьей главе, когда обсуждаются числовые типы. Кстати, GO ведет себя точно так же и в обоих случаях одна и та же простая логика - берется число с адреса где одни единицы, процессор добавляет один, получает число, которое содержит одну единицу и кучу нулей размером как раз с адрес, а по правилам когда число не влезает - отбрасываются старшие порядки, т.е. единственная единица. Это условность не языка программирования, а данных в компьютере.
Ну я не буду спорить, потому что не обладаю ни нужным опытом, ним сформированным мнением.
Ну как в крестах чтобы
перегрузок опервоторов в го нет. и это очень хорошо)
>В релизной сборке в компиляторе скорее всего включится оптимизация, которая посмотрит на код и решит, что a всегда меньше, чем a+1 и в итоге в результате компиляции в бинарнике у тебя будет:
Давай посмотрим с другой стороны: зачем тебе проверять а+1>а в принципе? Математически это всегда верно, но твоя проверка может быть только проверкой на переполнение. И вот какого-то хрена твоя проверка не работает. Для того чтобы знать о том что компилятор заменит твое выражения просто true надо знать и о свойствах численных типов и о свойствах компилятора, а для того чтобы не совершить ошибку тебе надо знать только о свойствах численных типов. Ты выбрал плохой пример.
Это был специально упрощенный пример для дискусси, призванный проиллюстрировать, какие вообще бывают ловушки. За более сложными велкам ту https://github.com/Nekrolm/ubbook , выбирай любую и охуевай
>>812646
Суть не в том, что они переполняются, а в том, что компилятор перехерачит твой код очень своеобразным образом, на чем кстати основана львиная доля хаков и ещё большая доля багов. Захочешь работать плюсовиком - готовься без шуток посвятить всю жизнь борьбе с особенностями компиляторов.
Я тут откликался на всякие вакансии и вот мне прислали тестовое на Go. Я ниразу даже не читал про него (в вакансии было указано, что типа нужен опыт программирования на любом языке, поэтому и откликнулся), поизучал тут недельку и вроде работает, но конечно сомневаюсь чет. Можете глянуть плз, есть ли какие-то критичные косяки?
https://github.com/Ivansergee/medods-test
круто, что всё в main поместилось, но 100% у ревьюеров будет вопрос будешь ли ты весь код в main.go писать в реальных проектах. раздели хотя бы на хендлеры/репозиторий.
плюс юнит-тестов нет - с разделением ты сможешь хотя бы на моках протестить хендлеры. интеграционные тесты для репы тоже неплохо бы иметь, но честно говоря хз как там на гитхабе монгу поднимать в CI
> Что имеется в виду под репозиторием?
repository pattern. слой который инкапсулирует работу с БД.
https://github.com/golang/pkgsite/blob/master/internal/postgres/postgres.go
Я переделал, теперь получше?
Не очень понял про этот репозиторий конечно. Я сделал просто пакет database и сложил туда все операции с бд в общем. Надо ещё пакет создать типа model и туда сложить структуру User? Я прост подумал ну там 2 сточки всего, ладно пусть там с логикой для бд полежит :)
по больше части красиво.
глобальная переменная с БД выглядит странно. я бы положил в структуру, методами которой были бы хендлеры.
пакет utils считают антипаттерном, его можно назвать tokens.
юнит-тестов всё еще нет. хотя бы на токены можно сделать.
GetUser/UpdateUser по-хорошему должны контекст на вход принимать первым аргументом.
Ну лан, спасибо. Почитал про utils, переименую) Мне уже сдавать надо прост. Тесты там же не говорили писать)) постоянно нихера не тестирую в своих работах, потом жопа подгорает конеш
Забейте, там на каждом шагу такая хуита. Буду патчить спеку.
Но там не особо вижу где применять гошную хуйню вроде sync. Так же, у вас блять фреймворки есть сука? Я попробовал gin, хуйня какая-то ебучая. Стал тупо гориллу юзать для роутинга
>Стал тупо гориллу юзать для роутинга
молодец
>Но там не особо вижу где применять гошную хуйню вроде sync
ну смотри. вейтгруппы - для параллельных сетевых запросов, например в соседние сервисы. мутексы - если ты там ну например кешируеш в памяти што-то к чему может идти параллельные чтения и запись. для микроговна это по большому счету все юзкейсы.
Задача:
Написать программу, которая использует две горутины, которые выводят числа от 1 до 100 поочередно
Вопрос:
Гарантируется ли, что в такой реалзиации (пикрил) мы прочитаем число из второй горутины, отправляя его из 1й? Может ли быть так, что мы начнем читать из канала в горутине, которая пишет в этот же канал?
> Может ли быть так, что мы начнем читать из канала в горутине, которая пишет в этот же канал?
Канал не буферизованный, значит чтение и запись блокирующие, т.е. горутина не может читать и писать в канал в цикле - будет дедлок
>Гарантируется ли, что в такой реалзиации (пикрил) мы прочитаем число из второй горутины
Если не буферизованный канал - да. Иначе в теории возможно.
Ну и одна из двух горутин утекает при такой реализации, в прод такое не должно попадать.
> Может ли быть так, что мы начнем читать из канала в горутине, которая пишет в этот же канал?
Канал не буферизованный, значит чтение и запись блокирующие, т.е. горутина не может читать и писать в канал в цикле - будет дедлок
>Гарантируется ли, что в такой реалзиации (пикрил) мы прочитаем число из второй горутины
Если не буферизованный канал - да. Иначе в теории возможно.
Ну и одна из двух горутин утекает при такой реализации, в прод такое не должно попадать.
Выбор у тебя между бэкендом и бэкендом. Бэкенд для вебсайтов, бэкенд для энтерпрайзной приложухи.
Смежно можешь ДевОпс посмотреть, но для этого бэкенд опыт все равно нужен.
>Го используется где-нибудь помимо веба?
Я видел прикольный 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, , но ничего так и не понял
В реальном мире бывает вообще только десятки неструктурированных методов без единого формата ответа, какой нафиг protobuf и gRPC
>В реальном мире бывает вообще только десятки неструктурированных методов без единого формата ответа
Ну так не работайте в говноконторах.
У нас все через gRPC, один раз задекларировал протокол и потом под любой язык можно сгенерировать клиент и сервер. Да можно все и с помощью OpenAPI делать, но у реста хуже возможности, хуже производительность, хуже производительность сериализации/десериализации. Из плюсов - можно дергать прямо из браузера, т.е. один и тот же эндпоинт можно дергать со странички и других сервисов хотя я с трудом представляю себе такой юзкейс.
> будьте богатыми и не болейте
Я нищий фрилансер без портфолио, не от хорошей жизни в этот кал лезу
Не знаток этой камасутры с байтами, но предположу, что в своей реализации, ты берешь адрес локальной переменной backAndFourth функции, т.е. в случае когда локальная переменная не сбегает в кучу (возможно при неправильной работе с Pointer), то при присвоении значения переменной внешней функции указатель уже будет ссылаться не на int.
Джава бесит прост, заебало разгребать легаси код на легаси языке. Джава - душное говно, хочется какой-то легкости, глотка свежего воздуха.
Очевидно заебались легаси ковырять
>к моменту попытки разыменования его указателя он может выйти за пределы области видимости
хуйню морозит этот тостер. из функции int возвращается бля, где там разыменование после выхода?
Я говорю про рынок в целом, сейчас ты бизнесу не нужен если не начнешь приносить деньги уже на следующий день. Поэтому нахуй нанимать чуваков которые будут тупить пол года год пока во все въедут? Никак не свитчатся
Понял брат
>как вы свитчитесь?
Как правило на сеньорные вакансии опыт в конкретном языке уже не играет роли. Я писал на Джаве, меня собесили на Джаве, а когда вышел сказали учить Го а могли сказать учить С++, смотря в какую команду бы попал.
>Бля никто бы тебе не сказал учить плюсы, не пиши кринж, "сеньёр"
Вкатунидзе, не пизди про вещи в которых не шаришь.
Очень и очень спорная хуйня. Ситуация, когда тебя нанимают на хз какой язык это пиздец и нормальные конторы таким не занимаются.
Как правило вариантов развития событий два:
1) Тебя сразу нанимают как сеньора в конкретном стеке, скажем в компании основной стек это джава и тогда тебя нанимают как сениор джависта, ожидая, что ты очень хорошо шаришь за jvm, инфраструктуру, бест практисы, экосистему и так далее. Этот вариант самый распространенный и самый же нормальный, потому что будь ты хоть уберсеньором на другом стеке, тонкости ты быстро не выучишь и к ним не приноровишься и первое время будешь на уровне условного миддла.
2) Тебя нанимают в первую очередь как сильного специалиста и готовы заливать тебя деньгами, пока ты не научишься чему они там хотят. Так делают всякие бигтехи типа убера, амазона и прочих. Но даже там тебя не кидают хз куда, в конце процесса найма тебя собесят уже в конкретные команды и на этапе оффера тебе предложат одну или несколько команд. У меня так друг-бекендер пошел писать мобилки за x4 зп.
>Тебя сразу нанимают как сеньора в конкретном стеке
Бизнес иногда переписывает весь свой код с языка Х на язык Y, по разным причинам.
Найти сеньора в двух этих языках на рынке труда мало вероятно, проще нанять сеньку в одном из них и доучить на месте.
Да ты сам стяни ебало, сеньер помойный. 10 лет тягал джейсоны и тут ему дали задание "плюсы изучи", ты как себе это представляешь чмоха сельская? Ты кто вообще? Выпускник мита в фаанге или че? Смех да и только блять
В этом случае тебя будут нанимать или как сеньора(миддла) в языке X, или в языке Y.
Нанимать сеньоров на полную ставку на язык, в котором они не разбираются - это абсолютное расточительство, потому что платить им нужно по сеньорски сразу, сеньорами в новом стеке они станут потом.
Глупо с этим спорить.
>Ситуация, когда тебя нанимают на хз какой язык это пиздец и нормальные конторы таким не занимаются.
Гугл и Амазон вообще не указывают язык, Майки указывают просто список типичных языков даже Джава там есть.
>Тебя нанимают в первую очередь как сильного специалиста и готовы заливать тебя деньгами, пока ты не научишься чему они там хотят. Так делают всякие бигтехи типа убера, амазона и прочих.
Не только, вот например https://careers.hellofresh.com/global/en/job/5010175/Principal-Software-Engineer-m-f-x как видишь там несколько языков. И по опыту общения с ними, могу сказать что знание только джавы им тоже ок.
>Но даже там тебя не кидают хз куда, в конце процесса найма тебя собесят уже в конкретные команды и на этапе оффера тебе предложат одну или несколько команд.
Не совсем так. На момент собеседования твоя команда еще не ясна, она будет ясна на момент оффера. У нас вообще несколько языков используется, основной Го, но есть части на Джаве и Питоне.
> Гугл и Амазон вообще не указывают язык,
и предложением ниже я указал почему
> знание только джавы им тоже ок.
вообще мне не противоречит
> На момент собеседования твоя команда еще не ясна
и при этом я специально написал "в конце процесса найма тебя собесят уже в конкретные команды"
На двачах смотрю ничего не меняется, люди как не умели читать дальше первого слова в предложении, так и не научились
>вообще мне не противоречит
А кто писал
>Так делают всякие бигтехи типа убера, амазона и прочих.
не ты? Или ты будешь заявлять что HelloFresh это бигтех?
>и при этом я специально написал "в конце процесса найма тебя собесят уже в конкретные команды"
Нет, не собесят тебя в конкретные команды. Хайринг комити решает в какую команду тебя звать, никаких дополнительных собесов с командой - нет.
>На двачах смотрю ничего не меняется, люди как не умели читать дальше первого слова в предложении, так и не научились
Дурак, ты сам в контекст не можешь, а на других киваешь.
По языку требования
>имеете от 3х лет опыта коммерческой разработки на языке Go либо владеете Python и одним из типизированных языков C/C++, Java, C#;
Если тебя не берут, это потому что ты тупой и ни на что не годный, а не потому что нельзя свичнутся.
Конечно, если вакансия весит это значит что им кто то сейчас нужен. Реальность же не такова что твое резюме даже не посмотрят
Пытаюсь свичнуться с начала августа, за все время получил один оффер и 3 приглашения на собес, сейчас подвис второй.
Опыта прямо разработки около 7 лет на разных стеках, последние 3 года энтерпрайз микросервисы на джаве.
HR сами пишут из крупняков, VK, Ozon, Avito, Yandex. От мелких контор 95% отказов, либо просто смотрят резюме. Видимо кто имеет возможность пылесосить рынок и расширяется, те заинтересованы.
Написал пару простеньких петов + решение тестового задания выложил на гитхаб. Что характерно гитхаб никто ни разу не смотрел, хотя ссылка на него и в профиле и в резюме на ХХ.
Лето - обычно тухлый сезон, в отпусках многие.
Если около джуниор, то как вариант попробуй стажировки от крупняков, их обычно в конце лета открывают, чтобы затянуть студентоту, но возрастного ценза как такого нет.
Мне кажется вариант свичнуться есть, но на активный поиск может уйти пара месяцев.
А так разве что крупняки - единственный вариант, у них обычно несколько этапов отбора на которых отсекаются те, кто просто го-тур прошел, могут себе позволить размеряно перебирать.
Угу, твое же кладется алгоритмами в отдельную стопку
У меня возникла проблема с следующим фрагментом кода, который иллюстрирует проблему. В этом сценарии я делаю 100 попыток получить определенное значение, и каждая попытка занимает значительное количество времени (50 секунд). В результате заданное время ожидания в 5 секунд начинает играть роль тайм-аута. Несмотря на то, что горутины GetSomething завершаются в пределах 5-секундного тайм-аута, горутины doGetSomething остаются в памяти в течение всего 50 секунд. Как я могу решить эту ситуацию и предотвратить продолжение работы горутин doGetSomething после их предполагаемого времени отмены?
Вот код:
https://pastebin.com/2HxLNgi1
Вот тред на стэковерфлоу с этой проблемой:
https://stackoverflow.com/questions/6807590/how-to-stop-a-goroutine
Там был ответ про томб, но там чето все плохо и рандомные паники в рандомных местах
Тебе нужно в ней обрабатывать контекст. В случае с таймером можно заменить time.Sleep на time.After и делать select по таймеру и по контекст.done. В реальном коде уже смотри по обстоятельствам
Ты хочешь чтобы она магическим образом завершилась? С хуя ли она должна? В ней написано спать 50 сек вот она и будет спать и ничего более.
Передавай контекст в doGet... и явным образом программируй ручками завершение функции, если был запрошен кансел.
Как изучить алгоритмы и структуры данных?
>Я просто не понимаю, почему так охуенно придумано, что я должен 150 раз проверять, если ли смысл горутине жить, вместо того, чтобы просто ебнуть её, когда она не нужна
Потому что убийство горутины не даёт ей корректно завершить работу. Это у тебя горутина ничего полезного не делает и её можно убить. А в реальном коде могут быть открыты файлы, сеть, базы данных и их надо корректно закрыть. Горутина может держать блокировку и надо её освободить. В конце концов надо что бы горутина была в сейфпоинте иначе могут быть проблемы с памятью.
просто будь собой
tl;dr: дрочи литкод
Изучи базовые структуры данных и сложности основных алгоритмов над ними: массив, связный список, хэшмапа, бинарное дерево поиска, куча, стек, очередь.
Из книг рекомендую "Алгоритмы на Java" Седжвика, на курсере есть курс по материалам книжки, записанный автором.
Возьми премиум на литкоде и начни решать easy задачи по базовым структурам. С премиумом у тебя будет возможность посмотреть разжеваное решение, хотя годные с объяснениями встречаются и среди решений других пользователей. Плюс литкода в том, что там иногда приводятся техники решения задач, которые не в каждом учебнике описаны - запоминай их.
Когда освоишься с изи, переходи на медиум, порешаешь задачи на динамическое программирование жадные алгоритмы, научишься комбинировать разные приемы работы с базовыми структурами в одной задаче,
Этого должно хватить даже для ФААНГА.
Как ты себе это представляешь? Для планировщика горутины это черные ящики, которые находятся в некотором состоянии или намереваются перейти в одно из этих состояний, он оперирует ими исходя из этих состояний. Планировщик не знает, что именно делает горутина и можно ли ее прихлопнуть не дожидаясь завершения. Горутины завершаются сами собой или прерываются паникой.
>А почему нельзя тогда планировщику сказать, чтобы он снял блокировки и её разъебал, он же их там паркует, создает, убивает и тд. ?
Потому что блокировка это не какая-то сущность рантайме, а просто тип который реализует некий функционал. Или вообще блокировка в другом месте, например ты создал WaitGroup(5), запустил 5 горутин и делаешь Wait(), а горутины должны вызвать Done(). Или ты вообще дохуя умный и написал свой спинлок. Или как по твоему планировщик должен понять, что надо конект к базе закрыть?
В джаве у класса Thread был метод stop() но его отключили именно из-за того что нельзя безопасно освобождать ресурсы. В C# аналогичный метод тоже задеприкейтили.
Спасибо дружище
>go: homebot/pkg/storage/sqlite imports
> modernc.org/sqlite tested by
> modernc.org/sqlite.test imports
> modernc.org/tcl: modernc.org/
tcq\ml ANUSvH1t1 PUNCTUM1H$h5 .2: reading >https://proxy.golang.org/modernc.org/tcl/@v/v1.15.2.zip: 403 Forbidden
Петушиный мув петушиной конторы
Не качается, это тупой блок по ip/подсети.
Они вот сейчас посмотрели задание и написали, что я иду нахер по причине "Для обновления токенов не нужен токен доступа, что делает выдачу access токена бессмысленным."
Вы не могли бы пояснить, а то я не понял, что не так сделано, мне прост интересно. Типа нужно access проверять для рефреша тоже?
Возможно, имеют в виду, что нужно передавать пару accessToken + refreshToken для рефреша. В условии задания сказано, что access и refresh токены обоюдно связаны. Т.е. нужно как-то эту связь на беке проверить, например использовать accessToken как "соль" для вычисления хэша рефреш токена, который ты в БД сохраняешь в привязке к юзеру. Тогда, при рефреше будет условно гарантировано, что пара токенов из запроса принадлежит конкретной сессии пользователя.
Но это как-то все равно не повышает секурности, т.к. скорее всего спиздят оба токена, если есть риски на клиенте или соединение дырявое.
Например у того же реддита для рефреша нужен только рефреш токен
https://github.com/reddit-archive/reddit/wiki/OAuth2
Возможно, оба токена в БД хранят, лол.
Подскажите лучшие практики по написанию микросервиса под прод.
Gin + Gorm всё ещё торт? Ну и чтобы поменьше ёбли было с тестами, есть ли какое-то фримворк или всё ещё руками пишете?
Обязательная поддержка .env файликом, чтобы была среда .env.test .env.local .env.prod(stage) итд итп
Раньше вот как-то писали директории /project/cmd/api/main.go, какая сейчас структура проекта?
Спасибо
>Но это как-то все равно не повышает секурности, т.к. скорее всего спиздят оба токена, если есть риски на клиенте или соединение дырявое.
Это может повысить секурность, если рефреш лежит в отдельном сервисе рефреша токенов. И когда у основного приложения протухает аксес токенов, оно идёт в сервис рефреша с протухшим токеном, и тогда рефреш уже с двумя токенами рефрешит аксес. Таким образом ни один сервис не хранит у себя 2 токена и злоумышленнику надо спиздить 2 базы.
>>824210
Что-то ребята совсем ахуели. Мало того что такие вещи джунам задавать, так ещё и требовать догадываться о таких не явных требованиях. При том что сами т.з. внятно и без грамматических ошибок не могут написать.
https://github.com/golang-standards/project-layout
Это не панацея и маст хев, скорее часто употребляемое.
в проекте может быть несколько api директорий, хз что ты имеешь в виду.
у нас например в /api хранятся ямлы для кодогенерации рестохуйни. а main.go апишки в /cmd/service.
я вполне вижу, что вместо service кто-то называет свой бинарник api, но не представляю кто будет бля ямлы складывать в /cmd/api.
>/cmd/service
Настолько зашкварно в голанке использовать сущности?
/cmd/entities
/cmd/repositories
Имхо, DDD для джавадолбаёбов, но как часто меняется коннектор к базе данных? Если я использую тот же Gorm, то зачем создавать репозиторий, если можно круды написать в слое сервиса. Keep it simple
Ты хотел сказать насколько? Нормальная практика, на любом языке круд шлепается +- одинаково, зачем изъебываться и придумывать свое.
Да лан, там 1к откликов было, ещё и с зарплатой вакансия, офк там будут че-то требовать. Хоть задание прислали и посмотрели даже. обычно прост игнорят.
>/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, то зачем создавать репозиторий, если можно круды написать в слое сервиса
да хоть в хендлере. хз насколько тебе удобно юнит-тесты писать только, если репу не прятать за интерфейс чтобы можно было замокать
А собственно сейчас в норм конторах алгоритмические задачки при устройстве на Go вакансию просят решать на голанге, или можно хоть на питоне ?
На выбор обычно 4-5 языков, которые в компании используются.
Можешь проходить на одном из них, если в маркетплейсы, то скорее всего будет пхп, если в финтех, то вместо php java.
Но алгосекция возможно вообще на любом разрешат, кроме совсем нишевых.
Меня например собеседовал андроиддевелопер, который не знал по сути го, но в целом шарил за алгоритмы и cs.
Зависит от компании. Кто-то готов на любом языке, а кто-то хочет посмотреть насколько ты хорошо знаешь Го, можешь ли писать код на бумажке.
Меня в Цукербук собесил питонист, а я писал код на джаве и все было ок. Алгоритм он и на Го алгоритм.
invalid import path (invalid character U+005C '\')
как контрить эту ебанину когда импортируешь файл из другой папки? Вручную менять пробовал, компилятор слал меня нахуй
Ну вот есть у меня в папке cmd файл main.go в нем пишу импорт и ввожу путь к файлу конфига. Точнее когда ввожу cfg := config.MustLoad() то он автоматически указывает путь к файлу config.go но потом прога начинает выебываться как показано выше. Начинаю своими руками вводить путь к config.go - тоже шлет нахуй
Пробовал не костылить свои конфиги, а использовать готовую либу Envconfig ?
Разве голанг полноценный язык? Я слышал, что на нём пишут отдельные высоконаруженные вставки, а остальное на основном языке.
Это правда, хитровыебанную бизнес-логику выносят на отдельные сервисы. Там, где всякая ебань делается в две строчки. Ну это пользовательский ввод, там никогда не нужно быстро что-то решать.
А так да, на голанге у нас был сервер автобиддеров и балансировщик, который 10 запросов в минуту решает, кек
какая версия go?
используй go modules, с ними проблем нет, тебе нужно импортировать пакет, а не отдельный файл
import "moduleName/someDir/packageName"
Я тонкостей не знаю импорта, просто создаю под каждый пакет одноименную директорию в проекте и оно работает.
Где как. Где-то пишут конкретные высоконагруженные сервисы, где-то всё подряд.
Выносят обычно в случае монолитов на каком-нибудь php или пистоне, где основной язык принципиально тормозной. Та же джава или шарпы сами по себе быстрые и ещё и под конкретный профиль нагрузки тюнятся лучше за счет настройки гц и вынос кода с джавы на го действительно целесообразен довольно редко, или когда код очень прожорливый по памяти и jvm тупо стоит многа деняк, или когда очень нужен мгновенный бутстрап сервиса не дожидаясь, пока jvm прогреется. Чаще всего же переписывают просто из-за технического хайпа, программерам нужно решить проблему тормозов и хочется попробовать новый расхайпленный язык и микросервисы, а тех руководство идёт у них на поводу.
Для написания бизнес логики го подходит, всяким станным людям из интернета здесь на слово верить не стоит. Логика выглядит многословнее и всё такое, но в целом я за последние несколько лет написания на го всякого особых проблем не встречал, любые паттерны и стратегии в целом программируются. Другой дело что лично я подустал уже от всех этих явных проверок на нил и отсутствия той же функции map() в стандартной библиотеке, хочется чего-то поизящнее. Выбрал бы раст, он почти как го, только не настолько примитивный, так ведь особо не пишет на нём никто бэкенды
На мой взгляд у го несколько странная ниша такого себе "С++ для тупых", с одной стороны оно компилируемое и поэтому работает быстро и недорого, а с другой есть гц и планировщик и не нужно приседать с указателями и программированием на темплейтах как в плюсах. С другой стороны, почему бы и нет, те же Badoo всё очень правильно делают. Наняли 300 пехапешников для того чтобы лепить фичи и 50 гошников, чтобы делать для пехапешников инфраструктурные сервисы.
У меня в папке есть много мелких проектов на го. Хотелось бы с ними работать из корневой папки. Но гошный плагин для вс кода начинает выделываться и пишет ошибку пакета main, из-за того, что проект во вложенной папке. Как сделать, чтобы вс код понимал вложенные папки и не писал об ошибке там, где их нет?
ну попробуй разобраться с гошными воркспейсами. может оно просто после go work init в корне заработает.
или как вариант вместо открытия родительской директории добавить все подпроекты в вскодовский воркспейс.
ну или не ебать мозги и просто сделать всё одним модулем.
почему не оба? ну то есть смотри гошка не то чтобы за дохуя времени учится, а пыха это почти гарантированное трудоустройство где ты будешь благородно поддерживать легаси, которое через 3 года перепишут на го. ты вполне можешь задрочить пыху и выучить основы гошки, которые на собесах могут спросить. и всегда иметь пыху как запасной аэродром, если не пройдешь на стажировку гошнеком.
>где ты будешь благородно поддерживать легаси, которое через 3 года перепишут на го
В голос с этих фантазий. Уж скорее на джаву перепишут, чем на Го, а более вероятно, что всё так и останется на пыхе.
Я не он, но это в целом очень популярный кейс, сначала пишут монолит на php, который приносит деньги и всё такое, а потом в какой-то момент упираются в то, что он хуево написан, там уже есть годичные кольца говнокода, это все медленно, неэффективно и тп и начинают переписывать его на микросервисы, и как правило в пару берут именно го, потому что простой и эффективный и не жрет столько же, сколько джава. Кейсов php->го было уже дофига, озон, лямода, авито, тд и тп. А вот php->джава особенно не помню.
>>829514
Я, будучи гошником, тем не менее рекомендовал бы идти поначалу в нормальный проект на php, потому что:
1) Рынок на пыхе больше, больше вакансий, легче искать и перебирать;
2) Хз насколько это актуально сейчас, но на пыхе больше аутсорса и раньше было легче найти что-то за $ или как минимум выше локального среднего по рынку, особенно ты не в Москве живешь;
2) Пыха больше склонна к фрейморкам, что является большим подспорьем для новичка, есть миллион гайдов, примеров "как делать", да и в целом ты работаешь и растешь на какой-то архитектуре. В го же, наоборот, фреймворки не любят и каждый проект собирается в соответствии со взглядами конкретного лида (в лучшем случае) или девелопера (в худшем); Поэтому на пыхе тебе будет и легче, и ты приобретешь больше архитектурного опыта и знания паттернов, для новичков это очень полезно;
3) Го это в целом довольно примитивный язык, без негативных коннотаций, просто по факту: в языке очень мало встроенных возможностей, даже дженерики до сих пор каличные; Новичку как правило лучше набраться кругозора и потрогать/посмотреть больше вещей и здесь какие-то более богатые языки подойдут лучше. Хотя бы тайп юнионы научишься использовать, простейшую функциональщину array_map вроде ещё не запретили и прочее;
4) Го как правило в компании появляется всё же как второй язык и поэтому чаще всего это уже взрослые проекты в фазе переписывания. Это тоже и снижает количество опций для джунов в индустрии, и зачастую повышает требования.
Но тут ключевое требование это
> _нормальный_ проект на php
Сама пыха стала с годами сильно лучше, но там всё равно велик шанс нарваться на очень говняный проект, который тебе ничего хорошего кроме денег не даст и не научит. Поэтому, маст хев: symfony или laravel, php8+ (чем больше, тем лучше, старая версия обычно означает хуевое легаси. 7+ ещё нормально, 5+ не бери ни в коем случае), использование встроенной в язык статической типизации, она в php несерьезная, но это лучше чем ничего. И максимально беги от любых crm, вордпресса и кастомных фреймворков.
А на го если всё таки решишься, то рекомендую пробовать крупные конторы типа авито, где хотя бы научат бест практисам и будет какая-то более менее выстроенная архитектура. Также очень популярен озон, но чет я хз, года 3 назад они были техническим калом с дикой текучкой кадров. Маленьких контор избегай, хз чего у них там внутри, а ты скорее всего ещё слишком неопытен, чтобы детектить копролиты на этапе собеса.
Добра.
Я не он, но это в целом очень популярный кейс, сначала пишут монолит на php, который приносит деньги и всё такое, а потом в какой-то момент упираются в то, что он хуево написан, там уже есть годичные кольца говнокода, это все медленно, неэффективно и тп и начинают переписывать его на микросервисы, и как правило в пару берут именно го, потому что простой и эффективный и не жрет столько же, сколько джава. Кейсов php->го было уже дофига, озон, лямода, авито, тд и тп. А вот php->джава особенно не помню.
>>829514
Я, будучи гошником, тем не менее рекомендовал бы идти поначалу в нормальный проект на php, потому что:
1) Рынок на пыхе больше, больше вакансий, легче искать и перебирать;
2) Хз насколько это актуально сейчас, но на пыхе больше аутсорса и раньше было легче найти что-то за $ или как минимум выше локального среднего по рынку, особенно ты не в Москве живешь;
2) Пыха больше склонна к фрейморкам, что является большим подспорьем для новичка, есть миллион гайдов, примеров "как делать", да и в целом ты работаешь и растешь на какой-то архитектуре. В го же, наоборот, фреймворки не любят и каждый проект собирается в соответствии со взглядами конкретного лида (в лучшем случае) или девелопера (в худшем); Поэтому на пыхе тебе будет и легче, и ты приобретешь больше архитектурного опыта и знания паттернов, для новичков это очень полезно;
3) Го это в целом довольно примитивный язык, без негативных коннотаций, просто по факту: в языке очень мало встроенных возможностей, даже дженерики до сих пор каличные; Новичку как правило лучше набраться кругозора и потрогать/посмотреть больше вещей и здесь какие-то более богатые языки подойдут лучше. Хотя бы тайп юнионы научишься использовать, простейшую функциональщину array_map вроде ещё не запретили и прочее;
4) Го как правило в компании появляется всё же как второй язык и поэтому чаще всего это уже взрослые проекты в фазе переписывания. Это тоже и снижает количество опций для джунов в индустрии, и зачастую повышает требования.
Но тут ключевое требование это
> _нормальный_ проект на php
Сама пыха стала с годами сильно лучше, но там всё равно велик шанс нарваться на очень говняный проект, который тебе ничего хорошего кроме денег не даст и не научит. Поэтому, маст хев: symfony или laravel, php8+ (чем больше, тем лучше, старая версия обычно означает хуевое легаси. 7+ ещё нормально, 5+ не бери ни в коем случае), использование встроенной в язык статической типизации, она в php несерьезная, но это лучше чем ничего. И максимально беги от любых crm, вордпресса и кастомных фреймворков.
А на го если всё таки решишься, то рекомендую пробовать крупные конторы типа авито, где хотя бы научат бест практисам и будет какая-то более менее выстроенная архитектура. Также очень популярен озон, но чет я хз, года 3 назад они были техническим калом с дикой текучкой кадров. Маленьких контор избегай, хз чего у них там внутри, а ты скорее всего ещё слишком неопытен, чтобы детектить копролиты на этапе собеса.
Добра.
Программист это ебаное дно и их работу заменяют нейросети, а девопсы это боги с гораздо большей зарплатой
У нас в бигтитьке все девопсы что-то пишут из инструментов своих на гошке. Так что забей на макакинг этот, катись в девопсы и потом оттуда можно уже и в сисяны и в инфрастракче девелопмент и прочее.
1. зп у программеров больше
2. вакансий у программеров больше
3. любой программер может стать девопсом, потому что мы и так умеем конфиги писать, а вот девопсу чтобы стать программером пришлось бы долго учиться нормально программировать
1. Падают вниз
2. Ты категорически не прав, конкуренции на вакансию девопса - 5 человек, на любую программистическую - от 50 до 1000
3. Роль девопса не только конфиги писать
Дак я могу выделить массив N длины, где N будет известна во время выполнения? Если да, то как?
Нет, так нельзя. Пользуйся постоянной длиной массива
1. Нихуя, растут вверх
2. Вакансий все равно больше, при этом "конкурируют" с тобой как правило 99% вкатышей со скиллфектори и прочего скама, так что их можно игнорировать
3. Как и везде там много всего, но я занимался админством, для мозга это все равно нативнее чем программирование и переход программеры->девопсы для мозга легче чем наоборот. Не нужно учить новые паттерны мышления, просто учишь новые инструменты да и все. Не говоря уже про то, что как программер я и так и кубы настраиваю периодически, и метрики пишу и смотрю, и тд и тп, так что футуршока у программиста особо быть не должно
>>832122
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. Скорее всего тебе это все не нужно, используй слайсы и не еби себе мозг. В реальной жизни у тебя практически никогда не будет задач, когда тебе реально понадобится
>>832400
6. По гошному скорее всего будет сделать свою структуру type LimitedSlice[T any] { s []T; limit uint64} и самому реализовать для нее операции append, set, тп. и там же проверки на превышение лимита
в новых версиях можешь сделать слайс и скастовать к массиву определенной длины, только панику не слови соколок https://go.dev/play/p/zLx99bbgGyR
Нет, без GoLand ты не найдешь сорс код разных либ, поэтому не сможешь стать лучше, смотря на код крутых челов
>VS code отлично справляется вообще со всем
Хотя бы сохранить значение выражения в переменную и подставить в местах где оно используется, VS Code уже научился?
Перекатился с джавы, юзаю дальше Идею, все четко
>Понятия не имею о чём ты говоришь
Ты блядь даже бабу IDE не нюхал. Пишешь ты код
if foo.Bar() > 0 {
...
}
Потом ты понимаешь что тебе надо что-то сделать с foo.Bar(). В нормальной IDE ты делаешь introduce/extract variable и у тебя создаётся переменная с значением foo.Bar(), а там где был foo.Bar() вставляется эта переменная. Это простейший рефакторинг, даже переименование сложнее. И его нет в этой убогой VS Code.
Лучше вначале поработать на Асп.нет или РНР годик, а потом переходить на го.
>там где был foo.Bar() вставляется эта переменная
Добро пожаловать в мир хардкода и гавнокода. Понял, я тебя услышал.
Если челик студент, то нужно сразу в гоху вкатываться.
Авито, яндекс, озон, вайлдберис набирают себе студентов круглогодично.
Просто когда работу менял, согласился пойти в команду, где Go/Python использовали, при этом зп апнул в два раза. Но в действительности оказалось, что проект - легаси монолит на питоне, с двумя микросервисами написанными на Go сборку, которыми всего лишь один человек занимается.
Сейчас, поработав там уже с начала февраля этого, появилось уйти на другой проект. Причины просты - легаси монолит на питоне плохо поддерживается у нас.
Память течет как не в себя, в произвольные моменты времени начинают течь потоки - периодически с нихуя внезапно возникает 250к системных тредов, которые ложат машинку и ее приходится перезапускать. И куча других проблем. При этом на микросервисы распиливать монолит не особо хотят. Разговоры об этом ведутся, но каждый раз выползает скуфидон-противник микросервисов и начинает доебывать всех вопросами о том, что нам это даст и не проебемся ли с микросервисами, и почему микросервисы это плохо в его понимании.
>Память течет как не в себя
К слову эта проблема у нас решается перезапуском.
6 раз в сутки по очереди перезапускаем каждую виртуальную машину.
Когда-то слышал, что в некоторых местах, где жирная джава крутится, перезапускают сервера раз в сутки, так вот у нас на питоне перезапускают 6 раз в сутки.
>Python на проде
земля гавной тем даунам, кто затащил неподходящий инструмент на проект.
>Rust/go
Отлично зарекомендовали себя в вебе. А голанг это "хуяк-хуяк и в продакшен"
> Если челик студент, то нужно сразу в гоху вкатываться.
гхм гхм
> 2) Пыха больше склонна к фрейморкам, что является большим подспорьем для новичка, есть миллион гайдов, примеров "как делать", да и в целом ты работаешь и растешь на какой-то архитектуре. В го же, наоборот, фреймворки не любят и каждый проект собирается в соответствии со взглядами конкретного лида (в лучшем случае) или девелопера (в худшем); Поэтому на пыхе тебе будет и легче, и ты приобретешь больше архитектурного опыта и знания паттернов, для новичков это очень полезно;
> 3) Го это в целом довольно примитивный язык, без негативных коннотаций, просто по факту: в языке очень мало встроенных возможностей, даже дженерики до сих пор каличные; Новичку как правило лучше набраться кругозора и потрогать/посмотреть больше вещей и здесь какие-то более богатые языки подойдут лучше. Хотя бы тайп юнионы научишься использовать, простейшую функциональщину array_map вроде ещё не запретили и прочее;
Удачи начинать с го, а потом по любой причине оказаться вовне и охуеть от непонимания, что делать с трейтами, что такое промисы, что такое observable и тд и тп. В радикальном случае такой студент гошник может не знать, что такое слои, middleware, di и прочую базу, потому что попал на особо "хардкорный" проект
> Удачи начинать с го, а потом по любой причине оказаться вовне и охуеть от непонимания
а зачем? годик продержишься и тебя будут звать работать гошником.
>непонимания, что делать с трейтами, что такое промисы, что такое observable и тд и тп
так работа это не образование. нахуй устраиваться писать хуйню, если всё это можно в бэкграунде подтянуть? учитывая што большая часть студентов уже имеет опыт с петоном/плюсами/жавой и разобраться в этой хуйне проблем не составляет. если составляет, то сочувствую конторе, которая таких нанимает
Почему разработчики го это всё скрыли? Даже в джаве эти конструкции открыты и можно создать свои аналоги. Создали слайсы, но программист на го не может создать свои слайсы, потому что не может управлять массивами.
Потому что голанг это про простоту
Инициализацию через init() в пакетах отличных от main выполняют гомосексуалисты или программисты?
нууу там есть юзкейсы, хотя редкие и в 99% случаев лучше сделать var globalA, globalB = initStuff(). на initStuff тесты поудобнее писать
в main это как раз максимально не нужно. в чем проблема засунуть сразу в main?
Я ничего не предлагаю, а лишь пытаюсь выяснить делают-ли так. Часто наблюдал, что в программировании не очевидных действий стараются избегать. Инициализация всякого говна в n-пакетов ощущается не очевидно.
>>835958
В некоторых ситуациях импорта (без инита) получаются пустые переменные и твой трюк не прокатит.
У меня значится была задумка сделать как в юнити InputSystem. Есть ActionMap или чето такое, где мы биндим действия к клавишам и методам с асинхронными колбеками. В итоге накидал примерно такой код.
Все работает, только вот если я слишком часто нажимаю кнопки, то игра жестко фризится, а иногда даже из-за неё зависает комплюхтер, как это можно исправить?
И в принципе я чето не ебу, стоит ли лучше сделать дерево апдейтов объектов и обновлять каждый раз всех потомков, имхо, в конечном итоге это будет очень долго работать
> В некоторых ситуациях импорта (без инита) получаются пустые переменные и твой трюк не прокатит.
не понел. оно в одно и то же должно компилироваться.
мне кажется что ты говоришь про ситуации, когда пакет вообще не импортят (например sql драйвер) и смешиваешь кейсы.
Я про переменные окружения. Если проебаться с порядком инициализации, то получаешь баги с тяжёлой диагностикой источника. Ну если у тебя не хелло ворлд.
ну это уже баг. если он происходит, то явно не надо так делать, и как его решать уже твоя эксперность должна выбрать. если хочешь избежать глобальных переменных, то можно из мейна эти переменные инжектить в сущность. либо пофиксить код пакета.
из интересного, вот такая хуйня например ловится на этапе конпеляции https://go.dev/play/p/75IuKEZa3qE
Вот я и хочу все инициализации в одном месте делать, а результаты по пакетам разбрасывать. Т.е. сразу видно все операции и не надо по директориям лазить, чтобы что-то поправить в переменных. Вопрос в том, не говнокод-ли это?
>Память течет как не в себя, в произвольные моменты времени начинают течь потоки - периодически с нихуя внезапно возникает 250к системных тредов, которые ложат машинку и ее приходится перезапускать.
Проблема в вашей криворукости, а не питоне. Если вы перепишите на го, ваши кривые руки не выпрямятся.
Судя по твоему коду это твой первый опыт. Поэтому хуярь дальше, учись писать горутины. В итоге у тебя игровой движок это как ивентлуп, нажатие кнопок выпускает событие, а обработчик это событие читает. А механизм любой
Все что смог найти это либо трёхлетнее гавно где половина команд уже устарела либо типичный хелловорлд где пишут только сервер и юзают постман в качестве клиента.
Хотелось бы что нибудь с 2 микросервисами и базовым обменом сообщениями между ними. И чтобы хоть какая нибудь рил-ворлд структура проекта была а не всё свалено в кучу.
12 месяцев
Ну это хуита, потому что разрабы написали, что вообще лучше всего использовать Update, иначе может быть плохо. В итоге я сделал дерево для процессов и для ui (LayerTree, UILayerTree) (инициализация всего этого добра пик1) и обосрался, потому что я не понимаю, что мне делать дальше. Ведь мне нужно из обработчика коллизий внезапно! обработать коллизии и вызывать событие или хотя бы сделать так, чтобы персонаж не мог дальше идти, сталкивался просто.
Я вот хз что на этом этапе делать, потому что из вариантов:
1. ивент бусси - мы даем доступ к каналу связи, ебошим что-то типа кафки на каналах, воркеры работают, обрабатывают команды и тд, но это уже звучит как мега говно
2. прокинуть нужные сервисы и вызывать что-то через них, но это нифиге не loose coupling, когда мы 25 сервисов друг с другом связываем зависимостями
И я вот хз, что мне делать вообще с этим всем.
Тоже сейчас на пыху перекатываться буду. По советам из /b/ выучил голанг+питон с соответствующим стеком, а работы для джуна хуй да нихуя. Если го, то обязательно 2-4 года коммерческого опыта, а на питоне только всякое говно с ботами, бустерами, парсерами. В моём миллионнике дико востребована пыха и 1с, плюсом гигакорпорации сишников с жавистами ищут, но там алгосы надо знать хорошо.
хотя не надо, вот нашёл лысого который нормально объясняет
https://www.youtube.com/watch?v=D0St2LH158Q
>И я вот хз, что мне делать вообще с этим всем.
Используй готовые игровые движки не еби мозга
Понятнее не стало. Это же не течь в памяти, когда отработает сборщик, все это будет удалено
Он никогда не отработает, потому что криворукие программисты не отпускают массив или карту. Часто ещё делают её глобальной, т.е. она будет жить, пока процесс не убьёшь.
Можно сделать расписание ребутов с доп правилами по потреблённой памяти и проблема решена.
Скорее тебя выпизднут на мороз вместе с предложениями многочасовых ревью. Больше ценятся люди, которые могут прикрутить костыль к вундервафле, чтобы кабаньи фичи быстрее выкатить.
Так же как и в го, не? Не высвободил ресурсы там, где это явно сделать предполагалось
А есть где-нибудь список с типичными ошибками нубисов? Немного трогал go до этого но мало, сейчас пытаюсь вкатиться полноценным гофером
Такой подход работает очень ограниченное время. Проект быстро придёт к состоянию когда вносить изменения в продукт станет сложно, долго и сопряжено кучей багов.
Пасибо!
пакистанцы доделают
Я себя оцениваю на джуна го, я бы это сделал часов за 8, норм ли такое тестовое вообще?
Хотят мидла за ЗП джуна?
Часа 4
>норм ли такое тестовое вообще
Задание норм. Но зарплата нихуя не норм. Джунов на голанге не бывает, стартовая позиция хотя бы 150-200к
ну я бы из интереса сделал, т.к. с голой кафкой и графкюелем не работал. а так да, часов за 8 можно разобраться и накатать. хотя за 100к конечно нахуй надо.
если бы это было задачкой на работе, то 2-3 рабочих дня
откуда джун знает как с графкуелем и кафкой правильно работать, а если что и напишет, то все равно мидлу придется все чистить вилкой либо вообще переписывать
Как в net/http передать в функцию хендлера запроса внешний объект (который уже запущен и в фоне выполняет вычисления, вызывать его на каждый запрос не надо, надо просто периодически выводить то что было насчитано в фоне).
В питонячем aiohttp все просто. А тут сложна, сложна и нихуя не понятно.
ну ты либо можешь хендлер сделать кложуром и захватить свою зависимость, либо воспользоваться функциями высшего порядка https://go.dev/play/p/LXu2IxkCpR_7 , либо хендлером сделать метод у объекта, у которого есть ссылка на твою зависимость
к слову, последний варик наиболее традиционный для реальных сервисов.
у нас под каждый хендлер заводится свой тип с методом Handle, в который через конструктор New передаются зависимости.
Но ведь замыкания - это не решение проблемы, а просто перенос её в другое место. Замыкания берут объект не явно из скоупа более высокого уровня, только в данном случае этими неявными будут w и r, а уже искомый объект будет явно. В таком случае с точки зрения концепта это ничем не отличается от не передавать объект ваще = он будет доступен через скоуп общего уровня. Так даже лучше, ибо неявно будет передаваться 1, а не 2 объекта.
>>840148
Спасибо за совет. Так и сделаю.
Кажется амбициозно за 8 часов, я бы 24 закладывал, хоть и миддл. Ладно, если бы у тебя был готовый шаблон со всей обвязкой.
Подскажите какие курсы/книги читать? есть какой-нибудь гайд?
Из релевантного - когда-то давно учил джаву/спринг стек, делал небольшие пет проектики. Шаблоны/алгоритмы почти не трогал, но в принципе понимаю как это подтянуть.
Есть какой-нибудь гайд?
Половину видоса рекламят свои помойные параши вторую половину рекламят свои курсы, а между этим говорят "мы вот самые быстрые юзаем хттп3, Квик, по нескольку тсп коннекшенов на загрузку файлов, у нас сдн по всей России", но ебаная закешированная страница ВК грузится 20 секунд, на Яндекс маркете каждый товар в выдаче подгружается как картинки по диалапу в 90х.
Причем я не на каком то дальнем востоке или Урале и всякие гуглы/амазоны/фейсбуки грузятся мгновенно. Почему так нахуй.
Это ты самую суть айтишного наебизнеса ухватил
>говорят "мы вот самые быстрые"
Так и ты говори
>нетворкинг
Не обязательно. В яндексе есть NOCDEV, который на го пишет, но это не единственные гошники в яше.
А вот конкарренси обязательно.
>Причем я не на каком то дальнем востоке или Урале и всякие гуглы/амазоны/фейсбуки грузятся мгновенно. Почему так нахуй.
У Гугла все очень хардкорно по веб морде, там чистый С++ с упором на оптимизацию перформанса. Дальше сервисы, там самые употребимые тоже стараются располагаться как можно ближе, куча метрик на перформанс с алертами на его проседание, автоматическое масштабирование сервисов при росте нагрузки. Там понимают насколько важен быстрый отклик. Не можешь быстро вернуть данные - быстро покажи пользователю, что запрос обрабатывается.
А у Амазона инфраструктура говно, у меня видео с amazon.de постоянно подвисает на предзагрузке. Это при том, что я в .de и канал норм.
У них в бесплатном курсе для Го одна вода. Вместо объяснения тем просто дают ссылки на статьи. На весь курс только пара сниппетов с кодом по типу хелловорлд. Ебаную дефолтную документацию не смогли нормально в курс оформить, сомневаюсь что в Продвинутом курсе что то по другому. Просто инфоцыгане.
Вот я взялся изучать го 3 дня назад.
Смотрю видосы, делаю серваки по мануалам, но у меня куча вопросов, типо что такое этот writer, что внутри request, как там под капотом происходит принятие/отправка реквеста, насколько оно вообще многопоточно само по себе. Вот могу я просто хэндлеры кидать в горутину? Что с ними вообще делать там можно. И никто это не обсуждает. Все этим просто пользуются.
Только самому сидеть ковырять или где то есть разбор таких вещей?
Я тоже помаялся 2 месяца так и ушёл учить РНР, где куча учебных материалов и всё расжёвано.
Меня не столько пугает отсутствие материалов, сколько что всем пофиг на это.
Как сделать то-то? Делай вот так.
Почему именно так? ...
Нет ли в работе такой хуйни, что все просто повторяют заклинания по созданию веб сервисов без понятия что реально происходит внутри?
>что такое этот writer
интерфейс
>что внутри request
>насколько оно вообще многопоточно само по себе
>Вот могу я просто хэндлеры кидать в горутину? Что с ними вообще делать там можно
заходишь в Jetbrains GoLand -> пишешь хендлер -> go to declaration or implementation, смотришь сорсы
Всё правильно сделал. Сервисы на голанке это сборная солянка из гавна и макарон всегда. Нет НИ ЕДИНОГО хорошего фреймворка, как yii Или laravel
Какую-то хуиту ты сейчас написал. В стандартной библиотеке все максимально следует стандартам и нет никакой магии совсем. Просто берешь сорсы и читаешь. Специально язык такой сделали, чтобы читалось легко.
>В стандартной библиотеке все максимально следует стандартам и нет никакой магии совсем.
Стандартная библиотека написана, в зависимости от того под чем сидел разработчик. В стандартной библиотеке 2 функции сортировки слайсов, у одной функция сравнения возвращает bool у другой int. Почему? Пошёл нахуй, вот почему! А та которая с bool имеет функцию StableSort. Как реализовать StableSort имея только функцию сравнения <=? Лучше тебе не знать сынок.
>Так с помощью этой операции можно вывести любую другую.
И увеличить количество сравнений в 2 раза. Ахуенно!
Ну и в целом охуенные решения типа
type Interface interface
Тут И нейминг от бога и сама концепция. В нормальном языке, ты у типа реализуешь функцию compare() а дальше просто передашь массив/список этого типа в функцию sort()/max()/min(). Но это конечно же не говей. Говей это создать тип для слайса, запиздячить туда функцию сравнения и базовые операции для слайсов. Вот тогда то его и можно будет отсортировать.
В целом согласен. Удобных структур для повседневного использования не хватает. Писать на каждый массив len less и тд не прикольно.
У меня есть вышка на погромиста, но я всё равно не понимаю где брать инфу по го. Вот все дают ссылки только на базовый синтаксис, а как писать полноценные веб-приложения - такого уже нет. А между тем там очень много вопросов: от архитектуры до инструментария.
Вся суть """вышки""" программиста. Не позорился бы, вкатун. Любой курсовичок после 9го класса знает инструмент и технологию лучше тебя
Курсовичок знает только в пределах изучаемого на курсе. или по какой причине их никуда не берут?
>или по какой причине их никуда не берут?
Потому что с 2014го года дефицит программист сходит на нет, сейчас 95% работающих программистов - имеют стаж больше 5 лет. 5% это те, у кого меньше 5 лет.
Нет НИ ОДНОЙ причины нанимать каких-то джунов, стажёров, это всё великое наебательство. Если ты вкатился до 2018го, то ок, можешь осваивать дальше профессию. если ты вкатился во времена ковидного хайпа - то будет смещён с пьедестала более старыми игроками на рынке
Быть мидлом-сеньором на текущем и выполнять те же самые обязанности
Я постоянно слышу обратное и что новых программистов набирают. Правда не на го, а на другие более ходовые языки типа джавы и РНР. Го действительно самый худший вариант для вката. Ну может хуже ещё раст какой-нибудь.
>8 часов
Ты уже явно не джун. Я его 4 дня делал. День писал базу, день на отладку и два дня на тестирование.
>Я его 4 дня делал
А зачем?
>День писал базу
А что там за проблема с базой, там одна таблица с фио, возрастом, полом и национальностью
Базой я называю всю реализацию, которую на следующий день люто дебажил.
>нахуя
До этого задания я знал только один фреймворк и как его тестировать. Это был стимул прокачаться по знаниям.
Продолжаем подчищать за лысым дебилом его дебильные косяки, глядишь ещё лет через 10 можно будет писать на сабже и не испытывать испанский стыд.
алсо тредик сейчас утонет
>Нет НИ ОДНОЙ причины нанимать каких-то джунов, стажёров
нуу им можно платить меньше. работают так же, как выгоревшие сеньоры
>Если ты вкатился до 2018го, то ок, можешь осваивать дальше профессию. если ты вкатился во времена ковидного хайпа - то будет смещён с пьедестала более старыми игроками на рынке
я за пару месяцев до локдаунов в 2020 вкатился, сразу в гошку без опыта. увольнять будут? рекрутеры пока сами пишут. за жизнь только по трём вакухам сам написал, когда искал первое место
Есть ли какие-то слухи о переводе го на llvm?
>нуу им можно платить меньше. работают так же, как выгоревшие сеньоры
Нет. Даже выгоревшие сеньоры, понимают что нельзя делать
res, _ := someFunc(...) // no error should happen
потому что он обязательно случится, хоть бы ты 100500 раз проверил аргументы функции. И куча другого говна, которого они наелись за свою карьеру. Сенька не пишет код в N раз больше джуна, он больше думает о последствиях. Чтобы не ёбнуло на проде, а если ёбнет, то хотя бы найти концы в логах. Он понимает, что работа это не про клин код, а про фичи для заказчика, но ты потом это говно поддерживать будешь. Поэтому надо и баланс соблюсти. Что пусть вы 100% договорились с другой командой про сроки и АПИ, но контролировать все равно надо.
Потому что гошка пока сыровата. Ты ещё охуеешь от вложенных структур, которые мигом могут изменить поведение массивов.
Двачую, пока чат гопота этого не сказала сам бы не заметил. Почему так криво сделано она не объяснила.
Строго говоря, тут нет противоречия. В го действительно все передается по значению, в том числе и мапы/слайсы.
Ведут же они себя так, потому что они содержат указатель внутри себя.
Если ты сделаешь что-то вроде https://go.dev/play/p/sm3e0nhrfnz то ВНЕЗАПНО встретишь такое же поведение, несмотря на передачу "по значению".
Сделано же так для того, чтобы избегать "лишних" копирований, так как мапы и слайсы зачастую бывают очень большими, то копировать их 100500 раз между всеми функциями будет очень накладно. В серьезной разгработке на го обычные структуры с большим количеством полей тоже начинают по указателю передавать, чтобы избегать копирований.
С картой разобрался, но срез - это вообще пиздец. Они создали такую структуру, чтобы пользоваться ей адекватно, необходимо прям ковыряться в её кишочках. Да зачем было её инкапсулировать, если без знания кишочков, я не могу ей пользоваться?
В реальных проектах такую хуйню вытворяют или это задачка с литкода? Просто выглядит максимально, ну ты понел.
Потому что структура сохраняет птр. И при копировании скопировалась не строка, а птр на строку
Всё равно не понимаю.
Вот допустим у нас:
s -> "foo"
f -> struct {
S -> ptr -> "foo"
}
Далее поменяли "foo" на "bar" в f и должно получится, что
s -> "foo"
f -> struct {
S -> ptr -> "bar"
}
Но почему у нас s поменялась? Эта переменная вообще на стеке лежит и указывает на строковый литерал.
Причем тут ассемблер, тебе компилятор не даст взять адрес у константы.
Почитай про указатели, чел.
> на стеке
Нет, компилятор сделает эскейп анализис и выделит память в куче, тому що лайфсайкл выходит за пределы тела функции. Ну конкретно в этом примере не выходит, лол, но нутыпонел.
>>850449
Ты меняешь значение переменной, а не строку.
вообще наверни рича хикки про идентити вс валюе, познай дзен и навсегда забей на байтоебство
До этого примера, я считал, что хорошо понимаю указатели. Есть опыт на сишке и ассемблере. Но здесь явно какая-то неочевидная магия в голанге.
Их так никто не использует, имхо. Погружать адресацию глубже одного уровня это извращение какое-то. Дебажить потом будет тот же умник, который эту хуету написал.
Потому что дот-профайл предназначен для хранения переменных среды. У меня вот например zsh основной шелл, смекаешь
1. это просто файл который большинство оболочек читают по дефолту, максимально оболочконезависимый. есть всякие .bash_profile/.zprofile и т.п., но чтобы не дублировать всякую хуйню, можно либо их не заводить (баш например .profile тогда будет по дефолту читать), либо тупо сорсить .profile из них.
2. rc файлы могут не загружаться при логине, если их явно из profile не засорсить. т.е. в общем случае все переменные, которые ты ставишь в rc, доступны только в интерактивных сессиях -
например, когда ты явно открыл терминал и там запустил программу (т.е. если ты просто запустил бинарник или скрипт, то он их не увидит). профайл файлы (.profile/.bash_profile/.zprofile) исполняются при логине и переменные доступны всем программам.
>rc файлы могут не загружаться при логине
Анончик, помоги, я вот эту таблицу составлял по баш-документации. Но похоже я что-то не так понял. Вот ты говоришь, что
>rc файлы могут не загружаться при логине, если их явно из profile не засорсить
Есть такое. Но с другой стороны, когда у нас обычное окно терминала, (== non-login interactive), логина же нету, т.е. ~/.profile не должен загружаться получается?
> , т.е. ~/.profile не должен загружаться получается?
сам файл не должен. но переменные наследуются от родительского процесса. когда ты логинишься, запускается логин шелл, читает .profile и потом спавнит другие процессы, которые наследуют установленные переменные.
Вот я изначально так и думал, просто сколько читал нигде такого пояснения не встретил.
Спасибо тебе анон.
про кишочки спросят на собеседовании энивей, так что знать надо
А что именно по-твоему в абстракции течёт?
Не совсем так, прям ковыряться в них не обязательно. Ты должен знать базовые правила:
Если ты пытаешься менять значения слайса, то помнишь, что значение поменяется везде;
Если ты что-то в него добавляешь, то возвращаешь его по аналогии с функцией append;
Если делаешь append, то всегда только в виде X = append(X, ...) и никак иначе.
Соблюдай их и всё будет just fine.
Я согласен, что можно было сделать чуть удобнее, например прикол с тем, что append может вернуть тебе старый слайс, а может как бы новый мне не очень нравится и я бы сделал по другому. Но в целом ты просто привыкаешь к трем правилам и становится норм, в реальной разработке об этом даже не задумываешься.
С мапами же все сильно проще, так как у них нет хитровыебанного append'а.
>>850264
Ну тут ничего сложно тащемта нет, изич. Если ты когда-нибудь писал на плюсах то вопросов вообще 0.
Конкретно так, как это сделал я - обычно оно не используется, это был просто пример. Хотя сами указатели и фигня с тем, что структура передается с указателем внутри передается "по значению" - это очень популярная история.
Даже давай так скажу, указатели встречаются регулярно, но в целом изменение чего либо по указателю это антипаттерн и используется нечасто, кроме ресиверов у структур (всякие методы типы `func (s S) Set(value string)`) и работой с пакетами типа sql или json (им как раз нужно указатели передавать). Поэтому так просто не делают и проблем с этим нет. 90% использования указателей это или оптимизация для того, чтобы не копировать жирную структуру лишний раз в новый скоуп, или как способ сказать, что переменная опциональная/nullable.
>>850438
Тебе действительно нужно почитать про указатели. Это переменная и она действительно лежит на стеке, но при этом тк она это указатель, то в качестве своего значения она содержит адрес другой переменной, которая уже будет в куче. И сделав `*f.S = "bar"` я прошел по этому адресу и поменял значение той, другой перменной из кучи. Сравни https://go.dev/play/p/sm3e0nhrfnz и https://go.dev/play/p/FOIuo62RCCs , разница должна быть очевидна.
>>850456
const a string = "blabla"
println(&a) // свалится с ошибкой компиляции
Не совсем так, прям ковыряться в них не обязательно. Ты должен знать базовые правила:
Если ты пытаешься менять значения слайса, то помнишь, что значение поменяется везде;
Если ты что-то в него добавляешь, то возвращаешь его по аналогии с функцией append;
Если делаешь append, то всегда только в виде X = append(X, ...) и никак иначе.
Соблюдай их и всё будет just fine.
Я согласен, что можно было сделать чуть удобнее, например прикол с тем, что append может вернуть тебе старый слайс, а может как бы новый мне не очень нравится и я бы сделал по другому. Но в целом ты просто привыкаешь к трем правилам и становится норм, в реальной разработке об этом даже не задумываешься.
С мапами же все сильно проще, так как у них нет хитровыебанного append'а.
>>850264
Ну тут ничего сложно тащемта нет, изич. Если ты когда-нибудь писал на плюсах то вопросов вообще 0.
Конкретно так, как это сделал я - обычно оно не используется, это был просто пример. Хотя сами указатели и фигня с тем, что структура передается с указателем внутри передается "по значению" - это очень популярная история.
Даже давай так скажу, указатели встречаются регулярно, но в целом изменение чего либо по указателю это антипаттерн и используется нечасто, кроме ресиверов у структур (всякие методы типы `func (s S) Set(value string)`) и работой с пакетами типа sql или json (им как раз нужно указатели передавать). Поэтому так просто не делают и проблем с этим нет. 90% использования указателей это или оптимизация для того, чтобы не копировать жирную структуру лишний раз в новый скоуп, или как способ сказать, что переменная опциональная/nullable.
>>850438
Тебе действительно нужно почитать про указатели. Это переменная и она действительно лежит на стеке, но при этом тк она это указатель, то в качестве своего значения она содержит адрес другой переменной, которая уже будет в куче. И сделав `*f.S = "bar"` я прошел по этому адресу и поменял значение той, другой перменной из кучи. Сравни https://go.dev/play/p/sm3e0nhrfnz и https://go.dev/play/p/FOIuo62RCCs , разница должна быть очевидна.
>>850456
const a string = "blabla"
println(&a) // свалится с ошибкой компиляции
Бля сраный двач не умеет в поинтед списки и я проебал форматирование. Вроде кроме `func (s *S) Set(value string)` ничего не поломалось.
\
ХА-ХА. *Попался
Внутри функции без дженерика, которая принимает произвольной Obj any указатель на структуру с данными
func (db *DB) Select(obj any) {
NewQuery[Type obj - ???](db, obj)
return
}
конечно есть. делаешь тайп ассершн и передаешь свой тип. ну или учишь свою женерик функцию работать с any
привет реддит
Но почему вы не используете gomodule?
я только вкатунов видел, которые по старой инфе из книг учатся. откуда информация, что кто-то модули не использует?
я настраиваю гопатх чтобы делать go mod init без названия модуля, тогда оно само из названий папочек всё подхватывает. у меня GOPATH=~/.local/share/go и ~/.local/share/go/src это симлинк к ~/src
>Продолжаем подчищать за лысым дебилом его дебильные косяки
Расслабь булки фембойчик. Просто ряд разрабов не понимают как работают замыкания. 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.
Но ведь тогда ты завязан на сортировке в репозитории.
А что если на фронте комбобокс с сортировками по имени будет?
Чем плох оффсет?
Твою, так как более производительная реализация. Оффсет говнопрактис в определённом контексте.
Так а откуда мне взять прошлые значения для параметров created_at и id?
Для первого запроса понятно, а если допустим будет страница номер 10, с чем мне сравнивать столбцы как добыть параметры предыдущей страницы?
Спасибо за ответ
Ну я ознакомился с мением в авторитетном источнике в интернетах, что для высокой нагрузки оффсет хуйня потому что при большом количестве записей последние страницы будут ворочаться еле еле.
> при большом количестве записей последние страницы будут ворочаться еле еле.
Это да. Но разве поиск строк по индексам не должен помочь?
Не Seq Scan имею ввиду
>>852024
Чел правильно сомневается, это известная ловушка при работе с большими таблицами. Суть в том, что для того, чтобы получить твои строки с неким оффсетом, тебе логично нужно все остортировать и прочитать все строки перед твоими, потому что ты заранее не знаешь, что скипать а что нет, особенно в случае каких-то сложных сортировок.
Поэтому любоая реляционная бд начинает тормозить при больших оффсетах и никакие индексы здесь не помогают.
Именно поэтому гугл и прочие стали page token'ы, которые по сутия вляются айдишником последнего просмотренного тобой элемента.
Соответственно именно так эта задача и решается, если представим, что у тебя последовательные числовые айдишники ака сериал, то если ты вернул последним айдишник 100500, то в следующем запросе делаешь select * from blabla where id > 100500 order by blabla limit blabla и базе вообще не нужно заморачиваться и выстраивать "лишние" строки перед твоими, она сразу берет только нужные и работает уже только с ними.
Отвечая на изнчаальный вопрос >>851982
>>852017
Если у тебя айдишники числовые, то они по определению упорядоченные и таймстампы тебе для этой задачи не нужны, можешь прям с фронта (ну или чего у тебя там) получать в качестве page token айдишник последней записи и все. Хранить эту хуйню нигде не нужно, просто возвращая фронту набор строк отдельной переменной верни ему айдишник последней и пусть фронт присылает тебе его сам при следующем запросе.
Сложнее будет если у тебя там uuid. По идее они тоже бывают с гарантией порядка, но если нет - то тогда используй только uuid, просто перед основным запросом отдельно ходи в базу, доставай по pk нужную строку и доставай из неё свой created_at, ну и уже сравнивай как сейчас делаешь.
Соответственно
> Так а откуда мне взять прошлые значения для параметров created_at и id?
фронт тебе сам должен их передавать, если он запрашивает эти страницы постранично. То есть по дефолту там ничего, после первого же запроса ты вернешь первую страницу и данные для второй, потом он запросит вторую и ты вернешь ему её и данные для третьей и тп.
> Для первого запроса понятно, а если допустим будет страница номер 10, с чем мне сравнивать столбцы как добыть параметры предыдущей страницы?
Просто "от балды" с таким подходом в рандомную страницу не ткнуть, это верно. Ограничения подхода, ничего не поделаешь. Есть техники вида по быстрому взять итератор в базе, пробежать и выписать себе айдишники 1,5,10,20,50 и тп страниц и вернуть их пользователю но это ну такое.
Но кстати если у тебя это пет проект или тестовое задание, то тебе скорее всего нахуй не нужно заморачиваться с этим. Бери оффсет и не парься.
Я программирую уже почти 10 лет сейчас в финтехе где у меня ~лярд строк в некоторых таблицах и почти никогда такие оффсеты не бывают нужны, чтобы такое городить. Пользователям обычно не нужны n-тысячные страницы.
>>852024
Чел правильно сомневается, это известная ловушка при работе с большими таблицами. Суть в том, что для того, чтобы получить твои строки с неким оффсетом, тебе логично нужно все остортировать и прочитать все строки перед твоими, потому что ты заранее не знаешь, что скипать а что нет, особенно в случае каких-то сложных сортировок.
Поэтому любоая реляционная бд начинает тормозить при больших оффсетах и никакие индексы здесь не помогают.
Именно поэтому гугл и прочие стали page token'ы, которые по сутия вляются айдишником последнего просмотренного тобой элемента.
Соответственно именно так эта задача и решается, если представим, что у тебя последовательные числовые айдишники ака сериал, то если ты вернул последним айдишник 100500, то в следующем запросе делаешь select * from blabla where id > 100500 order by blabla limit blabla и базе вообще не нужно заморачиваться и выстраивать "лишние" строки перед твоими, она сразу берет только нужные и работает уже только с ними.
Отвечая на изнчаальный вопрос >>851982
>>852017
Если у тебя айдишники числовые, то они по определению упорядоченные и таймстампы тебе для этой задачи не нужны, можешь прям с фронта (ну или чего у тебя там) получать в качестве page token айдишник последней записи и все. Хранить эту хуйню нигде не нужно, просто возвращая фронту набор строк отдельной переменной верни ему айдишник последней и пусть фронт присылает тебе его сам при следующем запросе.
Сложнее будет если у тебя там uuid. По идее они тоже бывают с гарантией порядка, но если нет - то тогда используй только uuid, просто перед основным запросом отдельно ходи в базу, доставай по pk нужную строку и доставай из неё свой created_at, ну и уже сравнивай как сейчас делаешь.
Соответственно
> Так а откуда мне взять прошлые значения для параметров created_at и id?
фронт тебе сам должен их передавать, если он запрашивает эти страницы постранично. То есть по дефолту там ничего, после первого же запроса ты вернешь первую страницу и данные для второй, потом он запросит вторую и ты вернешь ему её и данные для третьей и тп.
> Для первого запроса понятно, а если допустим будет страница номер 10, с чем мне сравнивать столбцы как добыть параметры предыдущей страницы?
Просто "от балды" с таким подходом в рандомную страницу не ткнуть, это верно. Ограничения подхода, ничего не поделаешь. Есть техники вида по быстрому взять итератор в базе, пробежать и выписать себе айдишники 1,5,10,20,50 и тп страниц и вернуть их пользователю но это ну такое.
Но кстати если у тебя это пет проект или тестовое задание, то тебе скорее всего нахуй не нужно заморачиваться с этим. Бери оффсет и не парься.
Я программирую уже почти 10 лет сейчас в финтехе где у меня ~лярд строк в некоторых таблицах и почти никогда такие оффсеты не бывают нужны, чтобы такое городить. Пользователям обычно не нужны n-тысячные страницы.
Большое спасибо за ответ!
Первый язык программиста это английский. Без устного английского тут делать нехуй абсолютно
Замыкания как работали, так и работают, их семантика не поменялась. Ты хоть текст по ссылке прочитай.
И это не единичное изменение - буквально все усилия команды разработки после взлёта сабжа направлены на исправление косяков лысого дебила, о которых буквально каждый говорил ему ч самого начала.
Ну смотри сам, работы программистом осталось на пару лет. Деньги на мифическое айти будет только в зарубежье. С русским языком ты никому не нужен будешь
Есть вопрос по тестам. Как тестировать хэндлер у которого есть id в ссылке?
Типа ссылка:порт/апи/id
Вроде тестирую как описано в гайдах, однако возвращает ошибку что неверный id параметр)
Получается путь такой:
Из ссылки берется id через context.Param и конвертится в int и далее этот инт передается и далее удаляется из базы запись по id.
Кроме id никаких вводных параметров нет. Код тестов:
Вывод консоли:
Буду благодарен за любой ответ!
Я сам понимаю что я где- то должен передавать id параметр для теста хэндлера, но не пойму где
Видимо отGoйдирован
зачем ты в NewRequest передаешь /:id вместо /123?
Теперь просто ловит панику
Ладно, не то написал, нахуя нужны мок, стаб фреймворки/либы, в которых нужно дополнительно разбираться, если можно самому заглушку простую сделать?
унифицирует код. иначе приходишь и у тебя от пакета к пакету разные ручные моки, с которыми нужно разбираться. у некоторых будут всякие returnErrorOnMethodSaveStuff bool, у других будут кложуры под методы задаваться или будут разные конструкторы, напилят там фанкшнал опций и всякой другой хуйни. а так разберешься с парой фреймворков и всё везде одинаково. ну и экономит время на написание, когда освоишься - сгенерировал и осталось экспектейшны написать.
хотя если что-то мокается мапой с одним методом и мапа понятнее выглядит в тестовой таблице, то можно и ручной мок написать.
Теперь вызывается,
Однако в консоли пишет что:
expected call at /handlers_test.go:107 doesn't match the argument at index 0.
Got: 1
Want: is equal to 1
Удачи со своей заглушкой каждый раз программировать хуйню типа
"ожидай 3 вызова метода foo(a,b,c) и чтобы a>10, b="bbb", c = false, а потом не больше одного вызова метода bar()"
Чем дольше сижу на программаче тем больше вопросов, сидит ли здесь кто-то кроме меня и совсем уж джунов
>ожидай 3 вызова метода foo(a,b,c) и чтобы a>10, b="bbb", c = false
скорее "ожидай AnyTimes() вызова метода foo(gomock.Any(), gomock.Any(), gomock.Any())"
Парни, как вы относитесь к тестировщикам?
Это ИТ специалисты или просто макаки тыкающие кнопки?
Дежурно напоминаю, что тестировать внутреннюю реализацию ненужно и вредно. Но если платят за количество написанных строк, то норм.
т.е. ничего кроме е2е тестов не нужно
моки могут и в юнит-тестах и в интеграционных использоваться.
в юнит-тестах они могут как мокать внешние зависимости вроде БД (т.о. интеграционный тесты превращаются в юнит-тесты) или внешние сервисы (обычно мокается твоя внутренняя обертка к апихе), так и внутренние зависимости - всякие другие пакеты того же проекта (т.о. юнит-тесты получаются более изолированные и простые).
в интеграционных тестах моками заменяют совсем внешние зависимости, которые независимо от тебя могут поменяться/упасть - т.е. внешние сервисы, но не БД твоего сервиса. в отличие от юнитов, тут моки уже могут подниматься отдельно, например https://hoverfly.io/ , и к ним идёт реальное обращение по сети.
>в интеграционных тестах моками заменяют совсем внешние зависимости
Имеет ли смысл тогда тестировщикам писать интеграционные тесты?
как бы нет, но вообще да. если прод упал и юниты не отловили какой-то тривиальный баг из-за несогласованности в критичном сценарии, то возможно стоит написать.
у нас такие тесты пишутся не всегда, обычно обходятся юнитами, а интеграционные чисто на работу с БД. а блэк-бокс интеграционные, которые весь сервис тестят, обычно только на самые критичные сценарии пишутся. пирамида тестирования как бы соглашается.
если ты говоришь что без походов во внешние сервисы смысла нет в этих тестах, то это уже должно енд-ту-енд тестирование покрывать
> если ты говоришь что без походов во внешние сервисы смысла нет в этих тестах, то это уже должно енд-ту-енд тестирование покрывать
ну или хотя бы отдельные от основных интеграционных тестов и не блочащие пайплайн. хуево будет, если ты не сможешь фиксы катить на прод, потому что на стейдже сломали какой-то сервис
Поделись как живешь щас, особенно в сравнении до ИТ.
Может тянки появились, одеваешься в крутой шмот, снимаешь хату с джакузи или может купил мерседес?
на мне сейчас литералли шмотки, которые я купил, когда за 35к стажером устроился. теперь я снимаю с себя плащ и волшебную шляпу, подхожу к тебе и провожу ладонью по
нихуя, я любитель жить как панкбомж. разве что развратился на яндекс.еде и пивасе. пару лет назад съехал от родителей, обустроил себе рабочее место (ну, поставил рядом с раскладным диваном из 90-х стол с регулируемой высотой и два 32' моника). решил купить акций и СЛУЧИЛОСЬ. потом опять, и опять СЛУЧИЛОСЬ. съебал в армению с билетом почти за полторы тогдашней ЗП. экономить на пивасе не приходится, но копеечка копится слабо, потом еще ебаться с нерезиденством придётся. на социализацию сейчас забил хуй, из дома обычно только в магаз выхожу.
просто какой-то выданный dell. как выпустился из вузика пересел на линух полностью. но 95% у нас в компании на маках и то же самое мог бы отвечать кто-то из них.
зайди в сорсы и открой блейм https://github.com/golang/website/commit/f079b53cbecfa6e1add922e383f052c5b3662964
интегралам тебя тоже зря научили?
Чтобы знать, когда мапа подходит, а когда нет. В других языках ты ещё можешь выбрать тип мапы под конкретную задачу и для этого тем более нужно знать особенности
1. Немного некорректно сравнивать, совсем разные ниши. Го скорее для производительных серверов, питон для прототипирования.
2. Питон сейчас больше в ML или скриптах для девопсовых штук.
3. Имхо го получше будет, пистон слишком динамический и слишком непроизводительный. А с многопоточкой там пиздец уже просто исторически.
если софт написан на нативном питоне, то это хуйня, если это дерганье функций си с питона, то это производительней го, раста, любой хуйни
Полный пиздец, ты явно не шаришь, причем даже сам не понимаешь, какую ахинею несешь. Никогда больше не давай никому советов, ни сейчас, ни в жизни вообще.
Производительнее никаких го и тем более уж раста он быть не может. Потому что во первых питон есть питон и поэтому львиная часть ресурсов у тебя уходит на то, чтобы обеспечивать питонячьи фичи типа динамической типизации, декораторов и прочего. То есть, в условной сишке, го или расте объявляя int ты выделяеешь на стеке свои честные четыре байта и всё. В питоне переменная может содержать что угодно, туда можно писать что угодно потом и тд и тп. Поэтому пистон тебе выделит некую абстрактную переменную не помню как в питоне аналог zval называется, которая может содержать что угодно. Она будет жрать больше как раз из-за того что это не просто 4 байта на стеке, а некий довольно сложный конструкт указатель на кучу лол. И потом каждый раз у тебя будут тратится ресурсы на проверку типов, приведение типов, тд, тп. И никакой cpython это не исключит, максимум оптимизирует тривальные случаи.
Во вторых, даже если ты втупую вызываешь некие сишные функции, то ты будешь тратить кучу ресурсов на интероп между питоном и си из-за разницы в представлении данных и прочего, что будет гораздо медленнее, чем если бы ты просто вызывал одну сишную функцию из другой.
В третьих, "просто вызывать сишку" не получится, так как ты сразу начнешь с размаху биться лицом об особенности программирования на си, всякие сегфолты и тп. В итоге ты уже или программируешь на си (но тогда нахуя тебе питон вообще?), или уж на питоне. Всякие написанные под питон и заранее скомпилированные экстеншены это как раз второй случай.
В четвертых, в питоне очень каличный рантайм. Там до сих пор тупой счетчик ссылок в качестве гц вместо хотя бы cms, но главное, что там до сих пор каличный и очень тормозной асинк. В отличие от гошного планировщика с горутинами или растовых рантаймов под это дело. В итоге если у тебя программа это не один большой цикл который нихуя не делает и не параллелится, то это будет тормозить из-за особенностей рантайма и нихуя ты с этим не сделаешь, вот вообще.
Полный пиздец, ты явно не шаришь, причем даже сам не понимаешь, какую ахинею несешь. Никогда больше не давай никому советов, ни сейчас, ни в жизни вообще.
Производительнее никаких го и тем более уж раста он быть не может. Потому что во первых питон есть питон и поэтому львиная часть ресурсов у тебя уходит на то, чтобы обеспечивать питонячьи фичи типа динамической типизации, декораторов и прочего. То есть, в условной сишке, го или расте объявляя int ты выделяеешь на стеке свои честные четыре байта и всё. В питоне переменная может содержать что угодно, туда можно писать что угодно потом и тд и тп. Поэтому пистон тебе выделит некую абстрактную переменную не помню как в питоне аналог zval называется, которая может содержать что угодно. Она будет жрать больше как раз из-за того что это не просто 4 байта на стеке, а некий довольно сложный конструкт указатель на кучу лол. И потом каждый раз у тебя будут тратится ресурсы на проверку типов, приведение типов, тд, тп. И никакой cpython это не исключит, максимум оптимизирует тривальные случаи.
Во вторых, даже если ты втупую вызываешь некие сишные функции, то ты будешь тратить кучу ресурсов на интероп между питоном и си из-за разницы в представлении данных и прочего, что будет гораздо медленнее, чем если бы ты просто вызывал одну сишную функцию из другой.
В третьих, "просто вызывать сишку" не получится, так как ты сразу начнешь с размаху биться лицом об особенности программирования на си, всякие сегфолты и тп. В итоге ты уже или программируешь на си (но тогда нахуя тебе питон вообще?), или уж на питоне. Всякие написанные под питон и заранее скомпилированные экстеншены это как раз второй случай.
В четвертых, в питоне очень каличный рантайм. Там до сих пор тупой счетчик ссылок в качестве гц вместо хотя бы cms, но главное, что там до сих пор каличный и очень тормозной асинк. В отличие от гошного планировщика с горутинами или растовых рантаймов под это дело. В итоге если у тебя программа это не один большой цикл который нихуя не делает и не параллелится, то это будет тормозить из-за особенностей рантайма и нихуя ты с этим не сделаешь, вот вообще.
Вместо того, чтобы десять раз в разных местах мокать метод криэйт, просто пишешь какую-нибудь ин-мем реализацию и чекаешь конечное состояние.
Алсо
> 2к24
> тестировать отдельный метод криэйт вместо генерации хождения по автомату через проперти-джен фреймворк
numpy go brrr
С одной стороны хотелось бы работать со списком как с удобной сущность и иметь готовые методы: добавить, удалить и т.п. Но так как сам указатель на начало списка может изменяться, то мы вынуждены возвращать его обратно. В итоге получаем такой код:
ln = ln.Add(10)
Дак может лучше создать интерфейс по аналоги со слайсами и создавать отдельные функции, а не методы?
ln = AddNode(ln, 10)
>Строка - это тоже срез? Как она выглядит под капотом?
Не совсем, у слайса есть length и capacity , а у строки только length потому что, строка иммутабельна и аллоцируется нужной длинны.
А что передаётся в качестве аргумента функции? Ссылка на начало строки или структура из ссылки и длины строки?
судя по всему, поинтер на структ, в котором поинтер на массив и длина
https://go.dev/play/p/Wkn7ze1vJqz
Чел, ты сейчас конечно базовые вещи говоришь, только это всё касается чисто питонячьего кода, коим приближением является cpython (не надо мне тут про девственный С заливать). Тяжелые либы пишут на С и пишут далеко не ссаные вкатуны. Всё скомпилировано, готово к использованию. Там выставлено апи для адаптера на питоне, отсюда и производительность, кладущая на лопатки го, расты и прочее говно, которое пытается занять нишу Чед-япа. Питончик только команды отправляет, да данные получает для какой-нибудь минимальной обработки. Нет там значимых потерь на таких операциях.
>Замыкания как работали, так и работают, их семантика не поменялась. Ты хоть текст по ссылке прочитай.
Зайчик, используй свою попочку чтобы удовлетворять своего бойфренда, а читай глазами. Я нигде не писал что менялась семантика замыканий. И я не только прочёл, но и дал ссылку на аналогичный кейс у C# очевидно что к этому моменту твоя жопка уже устала и про C# ты не прочёл.
> не понимают как работают замыкания
Ещё раз, дело не в замыканиях, а в семантике цикла, не понимают как работаеь цикл, замыкания тут ни при чем
>Ещё раз, дело не в замыканиях, а в семантике цикла, не понимают как работаеь цикл, замыкания тут ни при чем
У цикла как раз семантика самая простая и очевидная. Есть переменная цикла и она одна, ровно то, что написано. А хотят сделать неочевидную вещь, чтобы переменная цикла на каждой итерации выделялась заново. Как при этом будут работать циклы вида:
for i := 0; i < 10; {
i++
}
решительно непонятно.
> Там выставлено апи для адаптера на питоне, отсюда и производительность, кладущая на лопатки го, расты и прочее говно, которое пытается занять нишу Чед-япа.
Такого не может быть чисто физически просто потому, что в самом-самом лучшем случае соревноваться будет код некого экстеншена на си (и затраты на его вызов будут "нулевыми" только в идеале! А на самом деле все равно будут нихуевые косты и за вызовы из питонового рантайма, и за сам рантайм. Ну разве что если у тебя вообще поток исполнения никогда из твоей "либы" не выйдет, но тогда питон не нужен) и код на расте. Которые концептуально равны, но на самом деле llvm под капотом раста в любой более менее сложный код напихает тебе примерно дохулион оптимизаций.
В итоге в самом оптимистичном для тебя варианте (который как правило и всплывает в бенчмарках) у тебя будет какая-нибудь ссаная либа на си с тупым эвент лупом, которая читает и/или пишет в ответ некую статику в противовес сложному но комплексному tokio или чему-нибудь в этом роде, где код на си "выиграет" только по причине крайней примитивности задачи.
Но самое смешное, что даже в этом случае (скажем https://web-frameworks-benchmark.netlify.app/result) питон не входит в топ двадцать, проигрывая той же пыхе, потому что у пыхи намного удачнее сделано сишное апи и в целом она популярнее.
>Полагаю, что говнокод не будет работать. Зачем ты хочешь, чтобы говнокод работал?
Пиздец ты даунич. Ты вообще кроме хеловорда что-то разрабатывал?
Такой подход встречается постоянно когда надо итерироваться с переменным шагом. Можно посмотреть стандартную библиотеку
https://github.com/golang/go/blob/5e9afab7df87045bd919b120c1b05476e14d8a35/src/bufio/scan.go#L213
А ты не очень умный. Давайте всем тредом поможем Даше переписать говнокод так, чтобы он заработал.
>пук-среньк
Аргументы то будут? Может расскажешь как переписать Scan() по правильному?
Или так и будешь пиздеть какой ты охуительный разработчик, а все остальные говнокодеры?
>Как при этом будут работать циклы вида:
for i := 0; i < 10; {
i++
}
решительно непонятно.
решительно понятно:
i := 0
for i<10 {
i++
}
> как
Ты решительно очень тупой, но тредик уже помог Даше, бгг.
Чтобы почём зря не откапчивать капчу, заодно отмечу, что можно глянуть гит блейм и убедиться, что говнокод наклал именно тот, выпиливанием чьего говнокода из сабжа занимается команда сабжа последние скоро очень скоро уж как десять лет.
>Я тупой и могу только писать под себя
Ок.
>Чтобы почём зря не откапчивать капчу, заодно отмечу, что можно глянуть гит блейм и убедиться, что говнокод наклал именно тот, выпиливанием чьего говнокода из сабжа занимается команда сабжа последние скоро очень скоро уж как десять лет.
Да всем насрать на твои сексуальные отношения с лысым из бразерс, у нас тут про другое тред.
>решительно понятно:
Это не "как будут работать", а "как можно переписать". Вопрос то был в обратной совместимости.
>Вопрос то был в обратной совместимости.
В старых модулях все будет работать по-старому, в новых - по-новому
Можешь ли ты писоть и какоть только под себя я не знаю, а вот доказательства твоей тупости неоспоримы и видны всем выше по треду.
Тред про го. Лысый из браззерс - автор всех проблемных решений в го.
Про обратную совместимость, кстати, подробно написано в анонсе, у тебя с английским как? Поставь яндекс.браузер с яндекс.переводчиком
не должен. твоя ошибка с каналами не связана, ты просто все горутины заблочил, используя канал как инструмент.
https://go.dev/play/p/S0rTHgLII8J
Спасибо, вроде смог ликвидировать, только не понимаю, почему горутина в консоль не выводит test.
https://go.dev/play/p/H_Sbn4G-RV8
Вот это открытие, а я думал такое только для читающей горутины справедливо. Благодарю.
Почему этот код даёт три случайных варианта вывода:
1:
0 (ожидаемый)
2:
0
panic: send on closed channel
3:
panic: send on closed channel
Мб ты имел в виду такой код без строчки со слипом:?
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)
}
Поведение очевидное:
Если горутина успеет попробовать записать в закрытый канал, то будет паника
Если не успеет, то паники не будет, т.к. программа завершится до возможной записи в закрытый канал
Именно со слипом. Получал рандомный вывод и с go run и в песочнице go play.
Я к тому, что даю целую секунду на запись, потом закрываю канал. Очевидно ожидаю успеха, но иногда горутине не хватает секунды (хз почему) и случается паника. Ещё не понятнее вывод нуля, а потом паники, при том что я запускаю только 1 горутину, которая отправляет данные в канал.
>Очевидно ожидаю успеха
так никто не обещает, что горутина начнет исполняться в течение секунды. она начнет исполняться, когда шедулер её соизволит запустить
>иногда горутине не хватает секунды (хз почему) и случается паника
у тебя паника случается, когда горутина как раз успевает запуститься и отправить в закрытый канал
This. Ну и отсутствие понимания, что эти нули можно бесконечно выводить из закрытого небуферизированного канала. Изначально думал, что fmt.Println(<-testCh) ожидает получение элемента.
во-первых возвращаемое значение функции не аддрессабл. т.е. это уровня взять адрес от суммы интов &(3 + 5). его нужно сначала положить в переменную.
во-вторых, кажется что ты совсем не то, что хочешь, делаешь с поинтерами и если переделаешь нормально, то тебе адрес брать и не нужно будет.
похоже на Source Code Pro, но почему-то := не выглядит мерзко асимметрично тут, как обычно.
Блин, точно! Я после джавы совсем разучился с указателями работать.
Он не в структуре, а указатель на структуру.
Если что, то это не го вэй. Вместо того, чтобы получать указатель на слайс, просто возвращай новый так, как это делает сама функция append:
foo(x []int, a int) []int {
return append(x, a)
}
Менять что-то по указателю это в принципе плохая практика на любом языке. Так иногда делают ради перфоманса, но это явно не твой случай.
Вообще оцените норм ли такая схема сервиса как на пике, если нет, то что переделать и почему. CB - это cirquit breaker, чтобы бд могла восстановиться.
Что я хочу:
Клиент получает информационные сообщения и список актуальных данных с сервера.
Что я для этого сделал:
Создал 2 обработчика вебсокет, один из которых доставляет сообщения, а другой массив байт с данными. Всё работает, проблем нет.
Вопрос:
Грамотно-ли такое разделение с множественными соединениями по вебсокету? Сейчас увидел, что с помощью горутин можно запихнуть всё в один обработчик, но придётся немного заебаться на фронте, чтобы определять чего там с сервера пришло. Короче, классический вопрос, как делать хорошо и как не делать плохо.
Потому что книги пишут точно такие же Джуны, которые их и читают, только эти пиздеть умеют. А ты думал, что они пишутся крутыми профи? У реальных профи на это времени нет, да и не выгодно это
научи бедного стандартной библиотеке и он будет знать стандартную библиотеку, научи его читать документацию и он не будет ныть о том, что его чему-то не научили.
А вот в РНР документация на русском...
Совет тебе на будущее брат, умножай на 2-3 свои оценки
Нет
Охуенный же яп по сравнению со скриптовыми парашами. Учить меня долго не понадобится, ибо уже даже через кишки успел пройти. Не маргинальные либы для освоения закончились, сейчас щёлкаю задачки от нехуй делать. Что ещё надо работодателю?
>>863485
Пыху буду учить дальше, только если это понадобится для переписывания чего-то с неё на гошку.
Опыт разгребания говна, который невозможно получить делая домашние проекты по экзамплам библиотек.
Разгребал говно за собой, когда по 10 раз переписывал петы.
Суть такова - у меня за плечами 5 лет успешной разработки на шорпах. Правда из-за специфики текущего места работы за три с лишним года я развился в этом направлении примерно никак, так что на данный момент имею что-то ждуна+/повидла- по знанию платформы, пожалуй.
Работа окончательно заебала, собираюсь её менять. И тут два стула - дрочить шорпы, чтобы проходить собесы, и собственно их проходить, или же свичнуться на няшную гошку. Во втором варианте скорее всего будет уменьшение зарплаты хотя бы на первое время, но на ~120-130 я протяну изи. Что посоветуете? Свичиться ли, и если да, то есть ли советы мудрые?
А какие шарпы? Если формочки, то умножай свои заслуги на ноль. Если асп, то есть шансы вкатиться.
Что там няшного? Тонны бесполезного сахара, собран просто весь мусор со всех языков.
Да.
Я вот выбрал путь переменных среды.
Вижу в докерах посгреса переменные вида _FILE. Есть ли смысл дрочиться в гоу с таким же подходом?
https://go.dev/ref/mem
>Ни какого общего принципа нет. Запоминать все эти миллионы случаев ведь не реально.
чево? тривиальные гонки всегда видны. что-то посложнее может не всегда воспроизводиться, но рейс детектор с нужными условиями/достаточным количеством попыток отловит и скажет
>рейс детектор отловит и скажет
ладно, тут я погорячился. вполне можно написать код, который атомарно делает хуйню уровня "списываем деньги в одной транзакции, а начисляем деньги в другой транзакции"
чел, есть всякие варианты и они разнятся между конторами. у нас весь конфиг формально в .env и подгружается при запуске, но сам .env генерится из файлика, который настраивает помимо переменных еще инфру и метаданные сервиса т.п. а в других компаниях были приняты жсон/ямл конфиги, и томлы тоже видел.
так что какой бы ты путь не выбрал, велик шанс что после оффера тебе придется гнуться.
У нас сервис при запуске записывает инпут с микрофона и парсит его, попутно проверяя голос на подлинность.
у нас коннекшн стринги и всякое такое добавляется при генерации .env.
т.е. если ты указал в главном конфиге, что у сервиса есть постгрес, то при локальном разворачивании у тебя постгрес сам в кубере развернется и в .env сгенерится к нему коннекшн стринг.
> в каких случаях надо беспокоится о состоянии гонки
В которых ты можешь читать/писать одновременно, не? Что за тупой вопрос, если есть более одной горутины, которые шарят что то между собой - офк будет гонка
Некоторые структуры из стандартной библиотеки потокобезопасны. Так что это не тупой вопрос. Возможно ты сам до конца не понимаешь всю сложность.
Новый двач
>Виртуальную машину
Как ты её напишешь, если сам го не может в десктопные графические приложения?
Ну до рельсов им далеко, камон.
Всё сразу. Какие-то вещи через конфиг: например лимиты, трешхолды, какая-то статическая информация. Переменные среды используются редко, разве что всякие локали и таймзоны. Параметры запуска: порты, пароли, адреса.
>Ни какого общего принципа нет.
Есть мутабельные данные доступные нескольким потокам - есть гонка. Всё просто.
Придерживайся двух простых правил.
1) Если что-то в нескольких потоках только читается, но не меняется, то похуй, никаких гонок нет, забей.
2) Если что-то в нескольких потоках ещё и меняется, то всегда без исключений скрывай эту хуйню под мьютексом (на будущее - у теб ещё есть rwmutex, sync.Map и sync.Once)
> 2024
> давным-давно существуют системы типов, исключающие рейс кондишны, и потокобезопасные бай дефолт структуры данных
> Придерживайся двух простых правил...
Индустрия такая индустрия, эх
https://www.youtube.com/watch?v=r4bxlnS_h4I
Но их действительно нет, они обещали в следующей версии сделать нормально, но воз и ныне там, генерик аргументы не работают с генерик ресивером
>> 2024
>> давным-давно существуют системы типов, исключающие рейс кондишны, и потокобезопасные бай дефолт структуры данных
>> Придерживайся двух простых правил...
Типа там нет других проблем.
Щас бы слушать какого-то левого хуя вещающего на 3.5 калек не то, чтобы я был с ним полностью не согласен, но всё же
>>866730
Ты же знаешь, что ничего бесплатно не бывает, да? И твои эти "бай дефолт потокобезопасные" структуры в реальности показывают эффективность хуже, потому что под капотом там всё равно зачастую те же блокировки.
В го у тебя есть выбор, если ты заранее знаешь, что конкурентной записи не будет, то используешь обычные структуры и не получаешь просадок по скорости. Если заранее знаешь, что будет - то
- Или делаешь блокировки сам поскольку ты знаешь свой код и знаешь, где они нужны и что под них лучше запихать, например чтобы под одной блокировкой происходил целый набор действий, которые должны происходить атомарно.
- Или берешь как раз стандартную структуру, sync.Map (кстати rwmutex скорее всего будет для тебя лично оптимальнее), sync.Pool, sync.Once или что угодно ещё - и получаешь какое-то стандартизированное поведение.
Что же касается систем типов, то нравится тебе или нет - то го не такой, он умышленно примитивный с точки зрения типов. Такие здесь правила игры, если тебе это не нравится - то иди в раст скажем хотя я уверен что ты не шаришь и другие системы типов кроме джавовой никогда и близко не видел
>>867823
Чел проебался, думаю он хотел сказать, что ты не можешь делать дженерик агрументы у методов структур, либо у функций, либо у ресиверов и это реально не круто, надеюсь, в ближайших релизах исправят. В последнем вон, вывод типов улучшили, теперь хотя бы писанины стало меньше.
> эффективность хуже
Сперва корректность, потом эффективность. Преждевременная оптимизация и вся хуйня. Кроме того, это зависит от характера нагрузки. Кроме того, это не относится к афинным системам типов!
> у тебя есть выбор
(имплайинг в других языках выбора нет) - намеренная логическая ошибка, у тебя всегда есть выбор, просто некоторые языки по дефолту корректно себя ведут в современной вычислительной среде, а некоторые - нет.
> делаешь блокировки сам
В любом языке можешь делать блокировки сам.
> Или берёшь
1. Джве версии на каждую структуру данных - идеологически неверно (ты не туда имплемнтишь!)
2. Правильно так: ну вот если после запуска профайлера на реальной кодобазе выясняется что можно повысить производительность на 10% берёшь как раз стандартную структуру unsafe.SingleThreadOnlyDangerousMap и чётко обложив все её упоминания аннотациями и стресс-тестами получаешь какое-то потенциально неопределённое поведение.
> он умышленно примитивный
Нет, просто роб пайк некомпетентное хуйло, за которым теперь разгребают эту кучу утята разумеется не могут даже помыслить крамолы, ведь авторитет.
> я уверен
Я уверен, что твою мамашу ебали хачи
>Чел проебался
Я ж то же самое и сказал блеать, ну да ладно, главное что в итоге всё-таки понятно что имелось в виду
нормально сидим, че ты начинаешь
>Другие есть. Но они и в го есть. А вот рейскондишнов нет. А в го есть.
Силу косноязычную, в тебе вижу. Изъясняться тебе, понятнее учиться надо. Великим йоба инженером станешь ты, тогда.
Вообще ахуенно! Залетных нет, только те кто подписан или ищет по тегу. Раньше Java так делала, и было очень лампово, но потом пришли пидоры и стали перекатывать.
Ух сейчас бы в 2023 html/template
Лет через 5, вряд ли.
В душе неебу)
Это хеллоуворлд, а не полноценное веб-приложение. Как писать полноценные? В плане архитектуры, используемых библиотек, фреймворков, инструментов.
с какой целью интересуешься? если ты вкатыш, то тебя на рабочем месте научат - нужно просто повторить структуру соседних проектов. она не везде одинаковая))
если ты их пынямаешь,то на позицию джуна тя будут дохуя спрашивать про отличия массивов от слайсов, как работают горутины, архитектуру и тд
Ничего это не значит, у тебя этот код не скомпилируется даже, так как имя string уже занято.
Ну или возможно ты долбоеб и у тебя там в коде не string а String, тогда кто-то хз зачем просто создал кастомный тип.
Из пекейджа errorS, а интерфейс error называется, найди собсна разницу в один символ
Это не пробовал?
Дак там надо самому устанавливать, а потом обновлять тоже ручками. А тут пакеты сами обновляются, только по срокам не понятно.
Не надо тебе ничего самому писать, в го буквально шттп пекейдж имеет роутер из коробки и весь прилагающийся функционал
Может не будешь пользоваться подобием на ос, а просто использовать винду? Шизофреник
В чем проблема ручками установить если нужна свежая версия, чето я не понял? Вот тебе на оф сайте 3 шага предлагают сделать. Непонятно.
А что ты еще ожидал от 3rd party опенсурс сообщества, что тебе все нормальное на блюдечке делать будут? Как белый человек сам скомпиль, че ты как лох какой то
И как писать свои миддлвари?
Почему не напишут какой-нибудь фреймворк, чтобы там уже всё было? Просто берёшь и пользуешься.
Так го отлично умеет в кроссплатформу шизофреник, или ты из тех. кто юзает тот самый легаси драйвер, который требует CGO?
А что не так с го на Винде?
Требовалось написать небольшую прогу, которая будет запускаться хуй знает на какой Винде в каких условиях, возможности отладки не будет.
За вечер перенес функционал с питоняши на гошку и отправил, все работает, на го не писал до этого.
Мимо.
>Почему не напишут какой-нибудь фреймворк, чтобы там уже всё было? Просто берёшь и пользуешься.
Так есть уже! https://2ch.hk/pr/res/2871266.html (М)
Берешь и пользуешься, раз в неделю обновляешь конфигурацию и горя не знаешь!
>22.04
>LTS
ну во первых это лтс, а во вторых убунта это не роллинг релиз и гошку туда запакетировали не для вас молодой человек. хочешь новые версии, используй анстейбл/тестинг или роллинг релизы уровня рача. удел фиксд релиз плебеев это юзать древние пакеты или ставить себе хуйню в обход пакетного менеджера.
>>873966
зачем хороший язык запускать на хуевой системе? то то и оно. ну и конпелируется долго, я вообще охуел по 10с ждать вместо 1с
С чего ты решил? В универах как раз не приучают изучать что-то новое и следить за популярными библиотеками. Мы там писали в турбо паскале 7.0 сортировки и лишь для своих проектов можно было на С++ что-нибудь пописать.
> сферы применения
А не похуй где оно применяться будет, если оно там работает, и работает точно так-же? Ты разработчик, и не деплоишь на своем компе лол, тебе тупо код писать надо, ты обычная макака и не больше.
Ты если фронт писать будешь, тебе не обязательно прямо в браузере писать шиз
Go использует UTF-8 в строках, а джава UTF-16 и поэтому тратит на ASCII-символы в два раза больше памяти.
Это не универы
Конечно не похуй, ебаться для бэкенд разработки с вендой - это абсурд, для пердоль которым нечем больше заняться кроме как пердолиться с ос может и подойдет
panic(exception.New())
Самый главный плюс в том, что в го нет спринг-евангелистов и они не превратили код в спринг-какашку. На го можно писать по заветам Егора Бугаенко, внедрять зависимости в main, а не размазывать аннотации по всему коду.
У тебя буквально стандартная библиотека таким промышляет.
https://github.com/HyperDbg/gui
какие-то ошибки вылезают при сборке (liteide):
"C compiler "gcc" not found: exec: "gcc": executable file not found in %PATH%"
не пойму, зачем компиллятору Go нужен gcc?
Потому что го умеет только консольные программы компилировать, а графические - нужен модуль с С/С++. Это как в РНР подключают модули расширения на Си.
Как насчет gcc установить ссперва?
GOOS=windows CGO_ENABLED=1 go build .
ну и вообще тут не gcc нужен, так что скорее всего тебе еще CC=mingw или вроде того нужно сделать
из интереса довёл до конца. поставил mingw-w64-gcc и сделал
GOOS=windows CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc go build .
в вайне запустилось (?) даже без ебли
поделись, залей куда-нибудь!)
тут слишком сильное колдунство - сам не соберу. Что вот это значит:
GOOS=windows CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc go build
где это прописать?
mingw поставил, liteide 38.3, GoLang 1.20.07 (т.к. на Win7_x64 сижу).
вот тебе файлик https://files.catbox.moe/9kpbpg
ну смотри 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. или сам зайди в папку и посмотри как там бинарники называются
какая-то х-ня на 28Мб!
Это вообще-то должен быть Гуй к "новому мощному отладчику" HyperDbg. Файл скачался и запустился, но менюшки (кроме Exit) не работают, файл для отладки не выбирается, опции-плагины- вообще ничего не нажимается. Либо собрал криво, либо лыжи не едут..
Ладно, подожду ещё, пока в сети нормальные сборки появятся..
Спасибо!
Что ты понимаешь под полноценным?
Ну смотри, берешь любой хттп-сервер гошный, прикручиваешь постгрес/монгу, опционально какой-нибудь билдер запросов.
Обмазываешь все логгером и метриками, опционально реализуешь грейсфул дегрдашейшн и грейсфул шатдаун. Смотри, чтобы слои не протекали друг в друга, связывай компоненты через интерфейсы. Далее (а лучше в процессе) покрываешь свое поделие юнит тестами. Потом делаешь докер файл, довольно урчишь. Когда научишься поднимать свой йобаэппликейшн в докере, докинь интеграционных тестов на докер композе.
Да, можешь обмазаться openApi, если у тебя http. Охапка дров - и круд готов.
Да, правда
откликнулся на стажерскую вакуху на hh чисто чтобы попробовать, ведь модный молодежный язык. когда ответили, прошел go tour и пошел на собес.
Объясните плиз. Ничего не понимаю
Смотрел на ютубе собесы на го и они все показались мне сложными. Душат по языку, душат алгоритмами, душат всякой архитектурной парашей.
Вот начинать как раз не сложно. Тут сложнее продолжить обучение, потому что после определенного момента инфу фиг найдёшь.
Мне кажется сейчас не реально устроится в го без опыта. Берут только свичеров с других языков.
стандартная
Любому, у кого нет опыта в бэке
Устроился на работу, вышел оказалось что пишут на го. Ментор сказал почитать мурзилки про го и тамошние технологии. Через пару недель начал говнокодить.
>А на кого ты устраивался?
SRE/SWE. У нас на твой стек особо не смотрят, все равно учиться с нуля.
Но у меня за плечами 15+ лет опыта в топовых компаниях.
Грейд относится не к языку, а к навыку разработки.
Доучить "мидловые" фишки языка за неделю можно.
Когда у тебя интерфейс, изи
как в спеке написано и в компиляторе сделано
Типа "строка" not equal "строка"
Принтил с рефлектом, это точно string
Принтил значение - абсолютно одинаковые строки (пик1)
Однако в ошибке он высирает какие-то слэши и непонятно откуда \n, хотя я не ожидаю такого поведения в своем кейсе (пик 2)
Куда копать, двач?
json.NewEncoder добавляет энтры. json.Marshal вроде нет. Смотри как кодируется ответ в боди из хендлера
в сторону несравнивания жсонов в строковом представлении.
есть всякие jsondiff или можно в мапу/структ сложить.
Даже элементарно набираю пакет fmt и в вс коде просто жмёшь Tab и получаешь готовый импорт. Тут надо нажимать "сверх-удобную" комбинацию Alt+Enter. Далее в вс коде можно набрать ключевые буквы функции и она быстро найдётся и это очень удобно, когда полно всякие Printf, Println, Fprintf и т.п. В голэнде же хрен вам, а не ключевые буквы, надо набирать функцию целиком по порядку, пока их тупая система не отфилтрует лишние, т.е. если функция различается только последними буквами, то вы будете всегда(!) набирать функцию целиком.
В общем, не знаю за что они требуют такие деньги. Этот кал хуже бесплатного вс кода с бесплатным плагином от самих разработчиков го.
Дай угадаю, коммерческого опыта у тебя я так понимаю не было?
Мимо другой анон, нашел работу мидом в этом году, имея 2 недели опыта языка, перекат с другого
Так нах тебе вручную импортить, просто начинаешь писать fmt.Pr и тебе сразу в дропдауне все подходящие, оно тебе и импорт само вставит, никакие альт энтеры не нужны
Клеппман Мартин. Высоконагруженные приложения. Программирование, масштабирование, поддержка
Мартин Роберт С. Чистая архитектура. Искусство разработки программного обеспечения
Алгоритмы. Построение и анализ
Мартин Роберт С. Чистый код. Создание, анализ и рефакторинг
Ричардсон Крис. Микросервисы. Паттерны разработки и рефакторинга
Бхаргава Адитья. Грокаем алгоритмы. Иллюстрированное пособие для программистов и любопытствующих
варик попрогерить на фрилансе или знакомым с ип поделать заказы, чтоб они указали еще, что работал с ними и пойти на работку в офис кофе пить?
меня смутило 1000 откликов на каждую вакансию по питону, и щас его каждый школьник изучает
Есть гоферы-пхпешеры, которые переписывают с РНР на го, а есть гоферы-питонисты, которые переписывают с питона на го. Поэтому ищут чуваков, которые знают сразу два языка. Часто это свичеры.
чем читаешь?
>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 отказывается работать, если в методе указать приемник как указательный тип (со звездочкой)?
Схуяли? 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)
Вообщем как не ебать себе мозг и решать подобные маппинги, писать на каждый класс маппер - кажется путь в никуда.
>Вообщем как не ебать себе мозг и решать подобные маппинги, писать на каждый класс маппер - кажется путь в никуда.
вообщемто так болиемение и делается.
>Во всех пакетах Gems имеют идентичную структуру и сигнатуры методов.
вопервых нахуя их три. если это из-за того, что разъедутся в будущем, то кастование, даже если бы работало (хотя через ансейф ты вполне можешь это напердолить), отпадает, т.к. просто отложит проблему.
>нельзя взять и преобразовать []struct -> []interface, т.к. O(n)
так маппер так же за o(n) перекложит
>вопервых нахуя их три
да там прокси объект, который проксирует вызов апи других объектов, у которых спецификация одинаковая, но все типы этх структур в разных пакетах и это еще и либа, которую кодген наклепал и да, один из объектов отвалится как депрекейтед в итоге
Структуры настолько похожи, что кастуются, т.к. там в основном примитивы в полях
ну если тебе нужно упороться по перформансу, то я бы сделал через ансейф (и не забудь какой-нибудь компайл тайм чек добавить, что эта хуйня реально кастуется 1 в 1).
если хочется выебнуться, то интерфейсов бы засунул.
ну или по-обычному просто функцию которая сконвертит одно к другому. если кастуются, то это же тупо луп с одной строчкой в теле.
Но ведь кодогенераторы существуют. Я более чем уверен, что в крупных фирмах уже написаны кодогенераторы для создания микросервисов и задача джуна мидла как раз будет заключаться в том, чтобы задать правильные параметры для кодогенератора. В итоге написание микросервисы сводится к запуску и конфигурированию кодогенератора.
Дожили, лоукод решения для создания микросервисов.
всё так, я просто располагаю квадратики и микросервис билдится. вот скриншот
электрик
По нормальному - писать маперы которые будут перекладывать из А в B в C. Потому что если в А добавят поле, то это не сломает мапинг, а если удалят - то сломает на этапе компиляции.
Если ебашить через ансейф, то любое изменение полей меняет бинарную совместимость.
Тогда маппинг тоже придется править, там ситуация такая, что A - B - C - эквивалнтны по сути
и швец, и жнец, и на дуде игрец
Типа монорепа?
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, и получается микросервисная архитектура.
Что забыл?
Типа монорепа?
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, и получается микросервисная архитектура.
Что забыл?
Как всрато. Неужели нельзя на несколько реп распределить? Командам только интерфейс взаимодействия знать надо. Нахуя им остальной код проекта?
>Тогда маппинг тоже придется править
Если поля добавляются сразу во все 3 структуры - да. Так-то можно просто кастануть один тип к другому https://go.dev/play/p/zhhXOTbk1b
Но проблема в том, что если поменять A и B, а C забыть - то ошибка будет в рантайме.
>enity
models/dto
>usecase
repository
>adapter
service
>handlers
controllers
Сьеби в свой загон жава пидоров пж
>enity
>models/dto
Но entity это не не модели, и тем более не дто, это разные термины из разных слоев, одно домен, другое презентейшн/аппликейшн
>usecase
>repository
Как и юзкейсы и репозитории, это вообще джва разных слоя (юзкейс это вообще бизнес-термин, правильнее называть это интеракторами)
>adapter
>service
Вот тут ваще кекус, это совершенно разные вещи
>handlers
>controllers
В некоторых гомоархикектурах это тоже разные вещи, но в моём манямирке это одно и тоже.
Бля, а можно мне тоже зп синьки говнаря, раз у вас так всё плохо с архитектурой.
мимо недосинька на питухоне
Это копия, сохраненная 29 октября 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.