Это копия, сохраненная 5 августа 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
ВЕЛИЧЕСТВЕННОЕ БЕЗХОМЯЧЬЕ ЛОГО ЭДИШН
Go или Golang — компилируемый язык программирования от создателей таких шедевров, как UTF–8, язык С, UNIX, Plan9 и других. Go поддерживает типобезопасность, богатую и универсальную стандартную библиотеку функций и инновационные семантики одновременности: все то, что мы в индустрии называем concurrency и parallelism. На сегодня язык Go является маяком стабильности, прагматичности, де факто представляет из себя стандарт в мире бэкенд–микросервисов и серверного оркестрирования.
Обсуждаем язык, смеемся с залетных крестоносцев, обсуждаем почему нам не нужны дженерики, наследование и эксепшены, по каждому багу находим трехстраничный пост в официальном блоге Go, объясняющий почему это на самом деле фича, ждем, когда нам завезут дженерики, наследование и эксепшены.
Растобляди завидуют, сектантская запарта не переваривает.
С чего начать:
- В обязательном порядке проходим Go Tour: https://tour.golang.org/welcome/1 (есть на Русском)
- Читаем документацию прямо по порядку (пункт "Learning Go"): https://golang.org/doc/
- Ознакамливаемся с общим roadmap по изучению языка и сопутствующих инструментов: https://github.com/Alikhll/golang-developer-roadmap (постоянно обновляется сообществом)
Литература:
- Донован, Керниган "Язык программирования Go"
- Также хорошие книги для начала: https://www.golang-book.com/
- Книги из списка https://github.com/dariubs/GoBooks
Полезные ресурсы:
- Сборник паттернов и инфы по микросервисам: https://microservices.io/
- Смотрим видео https://www.youtube.com/channel/UC_BzFbxG2za3bp5NRRRXJSw
Обновляемый список с пакетами: https://github.com/avelino/awesome-go
Небольшой канал треда: t.me/golang2ch и даже живой
Предыдущий тред умирает здесь: >>2165418 (OP)
Elixir же лучше го, нет?
Шарп лучше эликсира.
>Что для вас хуже, или от чего больше воняет: копипаста в соурс коде, или ебанутое нагромождение абстракций?
они идут рука в руку, когда люди делают абстракцию и копипастят 15 "независимых" пакетов для своей абсракции, меняя там по одной константе, но в одном пакете неиронично добавляют две новые строчки. в то же время как это всё говно можно было сделать. просто. менее. абстрактным.
но, откровенно говоря, напрашивается вывод, что это не дихотомия, а ортогональные проблемы.
https://pkg.go.dev/github.com/alexflint/go-arg
Кобра
Как заставить себя пилить пет-проект?
Зачем.
flag. мне много не надо. обилие флагов это хуевый дизайн.
Никак, хороший пэт-проект можно запилить только на собственном интересе и энтузиазме. Найди интересную для себя тему и пили.
хочу вкатиться в go, как вообще идея, если нету коммерческого опыта в беке?
Начать с какого-нибудь другого языка для бэка, дорасти там до миддла и перекатываться.
на стажера опыта в беке вообще не надо. я вкатился, пробуй. один хуй у тебя всего штук 5 компаний куда надо пробовать - авито, озон и т.п. так что дохуя времени это не займет, плюс, если попросишь, то они тебе фидбек дадут. учить шарт/жаву должно быть твоим вторым вариантом, тебе на них все равно с таким же нулевым коммерческим опытом собеседоваться, разве что вакух в говноконторах больше.
> учить пхп цмс
А через 5 лет обнаружить себя ковыряющим магазины на битриксе. Отличный план.
Вкатывайся, работу на самом деле всегда можно будет найти, а с опытом, уже сможешь во всякие озоны и вайлдберсы вкатится. Есть у меня знакомый, который действительно хотел работать и искал на протяжении месяца, ну его и взяли, стажером (trainee) на Rust в маленькую (< 20 сотрудников) контору.
>А через 5 лет обнаружить себя ковыряющим магазины на битриксе. Отличный план.
Это значит 5 лет опыта программирования. Битриксом зарабатываешь, остальное для себя делаешь. Один из основных разработчиков Битрикса, Александр Сербул, пишет на Хаскеле и многих других языках, хорошо знает математику. Очень крутой инженер, умный человек. Не плюется и не кидается говном как вы школьники.
Тебе таким никогда не стать. Даже если ты не будешь использовать PHP и Битрикс. Проблема не в них, проблема в вас. Вы ни на что не годитесь. PHP можно использовать как ступень вверх. Вам же гордыня не позволяет. Для вас лучше быть нищим бездельником чем писать на PHP.
Пчел, я уже лет 10 на пхп....
> - Емкий пошаговый гайд с азов до джуна (go tour на максималках): https://www.practical-go-lessons.com/
зря убрали из шапки, тоже годнота
Вернёшь, когда будешь перекатывать.
ждешь каких-то ответов кроме https://github.com/avelino/awesome-go#gui который в ОП-посте? ну можешь свой на 2д либе вроде ебитеня https://github.com/hajimehoshi/ebiten накидать, вполне посильная и познавательная задача. ну и другие движки чекни.
На го нормальный гуи не напишешь.
Если нужен кроссплатформенный гуи, то бери электрон/js или qt/C++. Все остальное вымерло.
Гуй на жабе никогда не был популярен, а сейчас просто мёртв.
Уже 2 версии беты залили, релиз вроде в марте планируют
Как число STARS коррелирует с использованием технологии?
Я например ставлю звёздочку для добавления в закладки, чтобы потом посмотреть. Обычно на этом знакомство и заканчивается.
И да, добавленные проекты публично видны у тебя в профиле ?tab=stars, значит всякие вкатотуси добавляют себе проекты, чтобы выглядеть шарящими.
> значит всякие вкатотуси добавляют себе проекты, чтобы выглядеть шарящими
Так это же шиза уровня ревнующих тянок, которые следят кому их парни ставят лайки в инсте.
Я провел пол сотни собеседований ждунов, гитхаб публиковала половина, и самое интересное что там было это именно их код, а не то что они лайкали или форкали.
syntax error: function type must have no type parameters
syntax error: function literal must have no type parameters
syntax error: method must have no type parameters
Ну и нахуй они тогда нужны, если ничего сложного с их помощью нельзя сделать?
Спасибо, посмотрю!
Да в говне на всё Особое Видение, делают как угодно, лишь бы не как в других языках. Когда завезут эксепшены, тоже сделают какую-нибудь хуйню так, что никто не захочет пользоваться.
Исключениями и так никто не хочет пользоваться.
Вот, подумываю зайти в каждый тред, кроме Си и Паскаля, и обосрать ваши языки. Насчёт С++ не уверен. Он был хорош, пока туда не начали тащить лямбду.
А, так за что я же не люблю golang? Ну синтаксис вроде ничо так, но размер исполняемых файлов это полный пиздец. Понимимаю зачем и почему, но принять это не могу.
А что такое "в среднем"?
В целом есть опции как везде, например, обрезать символы (которые тащатся по умолчанию с бинарником) и узерать размер бинаря в среднем на ~треть и иже с ним. Правда никто не юзает, ибо нахуя.
Двачую, кого это вообще ебать должно, если ты не малварь для микрочипов пишешь. А если ты пишешь такое, то будешь писать на асме.
Анон написал, что размер бинарника - пиздец. Мне стало интересно, насколько жирный бинарники у го
Нет ты. Швейцарский нож для JSON, написанный на Си (jq называется) весит 300 КБ. А теперь посмотри на тупой нож для JSON, написанный на Го.
Имеет значение для чего? На го пишут энтерпрайза системы, где каждый микросервис - это обернутый в докер контейнер.
В среднем гошный сервис весит 10-50 мб.
Еще раз для чего и кого это имеет значение? Конкретный пример пожалуйста.
> На го пишут энтерпрайза системы,
Это такая хуета, что просто нет слов.
Оно конечно работает, но в "энтерпрайза" накладные расходы заоблачные. Какой-нибудь ёбаный сервис для логов и мониторинга отжирает как половина решения.
>>292127
>бинари по 60-120 мегабайт
Очевидно что это бинарный говнокод сгенерированный говнокомпилятором.
Наверное нужен мировой кризис, охуеный такой с общемировой депрессией, банккротством и разрушением производств, чтобы всю шелупонь смыло.
> 60-120 мегабайт
> для сервера
Лол. Я думал там за гиг-два оно вываливается, а тут всего лишь 100 метров
> Очевидно что это бинарный говнокод сгенерированный говнокомпилятором.
У нас много зависимостей и кодогенерации, так что не сказать что это прямо поток инструкций говна. Но да, го компилятор оптимизирован под другие вещи, размер бинаря оптимизируют по остаточному принципу.
>>292165
Ты учти, что при исполнении весть бинарь вычитывается в память, т.е. я еще ничего не сделал полезного, а 100 метров памяти уже занял.
> Наверное нужен мировой кризис, охуеный такой с общемировой депрессией, банккротством и разрушением производств, чтобы всю шелупонь смыло.
Ыыы бля а лучшы ядирная вайна штоп была!
Школотрон, спок, мы тебе не запрещаем лабы на асме и сишке писать.
>Наверное нужен мировой кризис, охуеный такой с общемировой депрессией, банккротством и разрушением производств, чтобы всю шелупонь смыло.
Никто тебе не запрещает написать компилятор для Go с динамической линковкой.
ну можешь тот же швейцарский нож написать и он у тебя целых три-четыре МБ будет вместо 1.5. функционал с размером слабо коррелирует.
>>292156
>Очевидно что это бинарный говнокод сгенерированный говнокомпилятором.
с такими размерами нихуя очевидного нет, они могут говна себе наэмбедить вроде свагера, у которого веб интерфейс 20 мб сразу отжирает. мне блядь вообще интересно сколько логики на 80 мб в сервис нужно засунуть
>>292127
>С одной стороны дохуя, с другой - контейнеры с системными зависимостями и без этих бинарей весят мегабайт по 200-300
никогда не понимал люди от лени или от незнания скратчем/дистролес не пользуются и тупо шипят даже не альпайн а целую убунту со всем говном
>>292171
>Ты учти, что при исполнении весть бинарь вычитывается в память, т.е. я еще ничего не сделал полезного, а 100 метров памяти уже занял.
а ты оправдывайся https://stackoverflow.com/questions/31722881/is-an-entire-static-program-loaded-into-memory-when-launched
>никогда не понимал люди от лени или от незнания скратчем/дистролес не пользуются и тупо шипят даже не альпайн а целую убунту со всем говном
зато можно потом потом на продакшне пошурудить как будто в обычном линуксе. И vim нормальный.
>истролес не пользуются и тупо шипят даже не альпайн а целую убунту со всем говном
И могут ли миллионы мух ошибаться?
$ curl -s https://hub.docker.com/v2/repositories/library/ubuntu/ | jq -r ".pull_count"
6507617222
$ curl -s https://hub.docker.com/v2/repositories/library/alpine/ | jq -r ".pull_count"
8695923962
$ curl -s https://hub.docker.com/v2/repositories/library/centos/ | jq -r ".pull_count"
1032061194
> никогда не понимал люди от лени или от незнания скратчем/дистролес не пользуются и тупо шипят даже не альпайн а целую убунту со всем говном
Где-то видел статью, что в случае джанго-приложения вообще не важно альпайн это или убунта, т.к. если установить все необходимые зависимости размер образа будет в обоих случаях больше 400 мегабайт
Потом всё это запилят. Скажи спасибо, что Пайк вообще снизошёл и стал пилить дженерики
Чтобы те, кто будет администрировать это говно складывали все эти динамические либы в один контейнер с каждым сервисом и конечный результат был ещё больше.
>а ты оправдывайся https://stackoverflow.com/questions/31722881/is-an-entire-static-program-loaded-into-memory-when-launched
Проиграл.
Ох уж эти зумеры-байтоёбы.
Ох бля как вспомню статические бинари в яшке на 900метров...
Куда тянуть? Как это вообще влияет на что-то? У тебя адсл на проде или что? Бред какой-то
Идеально был бы просто компилируемый руби. Только многомерные массивы менее ебануто сделать и идеальный ЯП.
Это константы со значениями, определяемыми во время, компиляции. А мне хотелось бы объявить неизменяемым, допустим, значение, полученное из функции, чтобы случайно его потом не поменять
> .const initializer f() is not a constant
Просто пиздец.
Оправдывайтесь, говноеды.
Ну делать можно например структуру с приватными полями и паблик конструктором. Один раз засетил поля, дальше менять не можешь.
Я свой первый комп с кассеты магнитофонной загружал.
А первый IBM PC/XT компьютер, до которого мог дотянуться, был в студенческой лабе и это был Искра-1030 с 640 Кб ОЗУ и HDD на 10 Мб, на котором умещалась MS-DOS, Turbo-C, студенческие лабы и одна игрушка. Вроде Digger. И всё это было снабжено чёрно-белым CGA-монитором. И игрушки там были не всегда, зачастую студенческие лабы занимали слишком много места.
>адсл
MNP5 9600 baud
Го это в первую очередь про еблю в джейсоны gRPC в гугле. Не хочешь такое пилить - попробуй поиграться в горутины и каналы, например в вебсокет-чате, веб-крулере или внезапно гуёвом приложении, например игре.
сделай какой-нибудь простой интерфейс для terraform.
ах ты не знаешь что это? ну так тебя предупреждали
>terraform
Ох и хуета ебучая. Нахуя вам кластеры разворачивать автоматически? Руками что, не судьба? Подъебать бы вас, подсунуть конфиг на пару тысяч мощных инстансов, что хостинг провайдер загнал вас в нищету и долги.
Да нам то не надо, но проклятые капиталисты хотят отнять у нас средства производства и для этого требуют, чтобы он тоже был в виде кода!
К сожалению, быть луддитом я не могу. Очень кушать хочется.
Ох лол, это мне напомнило как я взяв на проекте задачу по Цефу пошел в русскоязычное комьюнити с вопросом по нему, так меня там куча людей обложила хуями за то что я какой-то хуйней занимаюсь, которая им показалась бесполезной (я делал оператор по нему с определенной продуктовой логикой). После этого туда не заходил, стыдно
Таково любое русскоязычное комьюнити.
Ничего не понятно.
Понятно, только что твои рабочие таски незнакомые люди отказались помогать делать и обложили хуями.
Так по-моему любое коммунити делает. Просто не все выкупают тонкий стеб на английском
Незнаю по теме пришел или нет, подскажите анонасы, куда копать. Вообщем нужен бот на андроид, для автоматизации, грубо говоря создание кликера с интеллектом, куда идти, что изучать? Какой язык, какая ide нужна? Для игр на android планирую делать программы, которые будут выполнять рутинные действия.
Нет.
Спросить в андроид треде не догадался?
Есть, называются panic (try), recover (catch) и defer (finally), используй смело.
то, что у тебя в конпании юзают. от трейсинга смысла почти нихуя когда у вас 5 сервисов и три человека в команде.
> случайно не поменять
Просто научись сосредотачиваться. Я серьёзно: у вас в языке даже нет макросов, которые могут что-то неочевидно менять.
>Go или Golang — компилируемый язык программирования от создателей таких шедевров, как UTF–8, язык С, UNIX, Plan9 и других.
Это ещё что за пиздёжь?
Кен Томпсон стоял в истоках всего перечисленного. Пайк там тоже оядом был.
Bell Labs подарили миру дохера важных весчей.
Ты прикинь, создатели сишки и юникса создали сишку и юникс, 100500 лет ничего не делали и решили сделать Go.
>создатели сишки и юникса создали сишку и юникс, 100500 лет ничего не делали и решили сделать Go.
Пиздец они потешные.
>улучшенный Limbo
прикольно, такие же каналы, как в го
но зато в нем есть туплы, а в гошке нет =(
текущий дает только на рабочем(
кто в чем кодит?
не знаю, хочется купить all-product-pack от jetbrains, но жаба душит
можно купить только goland или только idea
или лучше привыкать к vscode?
надо было просто юзать вскод с самого начала
t. не пользуюсь голандом хотя лид сказал лицуху выпросить
не катит же
раньше же работали публичные license-сервера, вроде xidea.online
вбил - все работает
а сейчас джетбрейнсы гайки затянули
#!/bin/bash
#https://github.com/PythonicNinja/jetbrains-reset-trial-mac-osx/blob/master/runme.sh
for product in IntelliJIdea WebStorm DataGrip PhpStorm CLion PyCharm GoLand RubyMine Rider; do
echo "Closing $product"
ps aux | grep -i MacOs/$product | cut -d " " -f 5 | xargs kill -9
echo "Resetting trial period for $product"
echo "removing evaluation key..."
rm -rf ~/Library/Preferences/$product/eval
# Above path not working on latest version. Fixed below
rm -rf ~/Library/Application\ Support/JetBrains/$product/eval
echo "removing all evlsprt properties in options.xml..."
sed -i '' '/evlsprt/d' ~/Library/Preferences/$product/options/other.xml
# Above path not working on latest version. Fixed below
sed -i '' '/evlsprt/d' ~/Library/Application\ Support/JetBrains/$product/options/other.xml
echo
done
echo "removing additional plist files..."
rm -f ~/Library/Preferences/com.apple.java.util.prefs.plist
rm -f ~/Library/Preferences/com.jetbrains..plist
rm -f ~/Library/Preferences/jetbrains..*.plist
echo "restarting cfprefsd"
killall cfprefsd
echo
echo "That's it, enjoy ;)"
Выполняешь после окончания триала, не благодари
#!/bin/bash
#https://github.com/PythonicNinja/jetbrains-reset-trial-mac-osx/blob/master/runme.sh
for product in IntelliJIdea WebStorm DataGrip PhpStorm CLion PyCharm GoLand RubyMine Rider; do
echo "Closing $product"
ps aux | grep -i MacOs/$product | cut -d " " -f 5 | xargs kill -9
echo "Resetting trial period for $product"
echo "removing evaluation key..."
rm -rf ~/Library/Preferences/$product/eval
# Above path not working on latest version. Fixed below
rm -rf ~/Library/Application\ Support/JetBrains/$product/eval
echo "removing all evlsprt properties in options.xml..."
sed -i '' '/evlsprt/d' ~/Library/Preferences/$product/options/other.xml
# Above path not working on latest version. Fixed below
sed -i '' '/evlsprt/d' ~/Library/Application\ Support/JetBrains/$product/options/other.xml
echo
done
echo "removing additional plist files..."
rm -f ~/Library/Preferences/com.apple.java.util.prefs.plist
rm -f ~/Library/Preferences/com.jetbrains..plist
rm -f ~/Library/Preferences/jetbrains..*.plist
echo "restarting cfprefsd"
killall cfprefsd
echo
echo "That's it, enjoy ;)"
Выполняешь после окончания триала, не благодари
Шоб Кабаныч твой триал так сбрасывал, собака!
> https://tour.golang.org/welcome/1 (есть на Русском)
ГДЕ на русском? На японском, бразильском, польском вижу, а на русском - нет(
а оно точно так работает?
я недавно брал триалку, оно требовало, чтобы я залогинился в jetbrains аккаунт и оно хранит инфу о триалах там.
или это надо какую-то старую версию ставить?
Хз, я идеевскими продуктами в основном не пользуюсь. История по коммитам у них очень приятно сделана, только ради этого стоит. Обновил до последней версии, запустил, да, учетку потребовало. Авторизовался, запустил сброс триалки - готово, предлагает триалку на месяц. Полагаю, они инфу о лицензии хранят, но не о триалке
Или только бэк?
в теории можно
мобилка - fyne
веб - vugu
они выглядят более менее зрелыми и юзабельными
но опять же, нафига нормальному бэку скатываться до уровня клиенто-макак?
не прокатило
>Error fetching licenses for GO / anton : Existing trial license for GoLand 2021.3 is expired
Ну хз, трудно сказать. Я на пайчарме так уже месяца 4 сбрасываю лицензии. Попробуй удалить лицензию, потом накатить скрипт и попробовать триалку.
Что значит не всегда?
Какие еще есть сферы для Го?
Нашел какой-то gobot, типо для роботов и дронов.
Еба, челик, если ты работу ищешь - пиши бек, про остальное пока забудь. Если спрашиваешь про то, можно ли написать Х на нем? Можно. Даже перл можно засунуть куда угодно, надо ли только.
Хуя грузчик из ашана пригорел.
пидорасами они стали еще лет десять назад стали, когда ввели подписочную модель
вот тогда они основательно в говно окунулись
но нет, выплыли как-то
Это когда ты сам создаешь себе проблемы и героически их решаешь. Например shared database vs per service database, eventual consistency
Только тс-с-с-с! Тихо! Чтобы Кабаныч не услышал...
Я не хочу нарушать свою приватность. Как будто им моих денег мало, предлагают ещё надеть ошейник в виде емейла, чтобы жрать их рекламу.
wildberries (может и ozon тоже) на hh набирает стажеров на go. Попробуй отправить резюме, лучше с каким-нибудь своим кодом. Вдруг фортанет.
А так да, в основном все ищут уже с опытом go или другого языка. Джунов по факту нигде не берут.
варики еще два года назад были. я понимаю, что за два года всё может поменяться, но я недавно хх чекал и стажеров всё ещё набирали, не вижу причин почему это может поменяться. просто хх чекай епта. алсо в контору пидарасов (вб) не иди если другие варики есть.
Иди пиши круды, когда подрастешь, приходи и можешь тролить
С авитой что? Вроде там жёстко попускают на собесах, даже если ты на энтри-левел самый заявляешься.
Стоит туда пробиваться? Или искать нормального Джона Бора?
по экспириенсу в авите норм на собесах было и вполне интересно/познавательно. я бы сказал что стоит попробовать. они фидбек дают и даже книжки могут порекомендовать. если не дали, то попроси словами прост, херочка с человечками переговорит и с чем-то вернется. лично я практически обосрался на собесе с задачками легче, чем литкод лизи, но прошел на мидла, что и было моей целью. майлейдж мей вери оф корс. алсо старайся несколько оферов одновременно получить, это вообще изи 20-40% прибавка (хотя если бы я на стажера собесился ради опыта, то мне было бы на это похуй)
ждём на хайринг дей короч https://hiringday.avito.ru/go
Что за софтскилы? Я пчёл залетный и не понимаю что вы там проверяете, но вообще умею немного в риторику(черную, белую) это про это? Типа чтоб углы сглаживать в общении с коллегами?
хз честно говоря. лично я себя бы откровенно не пробил, но видимо интервьюеры добрые попались. я чисто зафакапил из-за волнения (там штук 9 на прогаммировании было наблюдателей) на вопросах, которые я знаю, как решить. на фидбек части сказали, что большинство и двух задачек не решили и на самом деле еще хуже можно было обосраться. как я понимаю, у гохи не только нехваток вакух, но и нехваток кандидатов при этом.
>>296741ё
ага, углы при общении сглаживать, но при этом высказываться, если тебя что-то беспокоит. "результат начинается с меня", "решай быстро и аргументированно" и всякое такое из ценностей. в финальном интервью была довольно долгая часть с двумя лидами, но ответы, которые они хотят, вполне очевидные на самом деле и просто не будь дохуя конфликтным и т.п.
>решай быстро и аргументированно
Всегда проигрывал с этого. Когда условия противоречащие, когда причина ошибки даже близко неизвестна, когда взаимодействие идет с третьей стороной, у которой нет версионности апи и оно меняется со как ебыри у шлюхи
Я думаю 99.9% обычных не борщехлебов как ты кодеров тебе не скажут ничего лучше "а ты посмотри как в компиляторах других языков устроено", но ты, наверное, и сам до этого дошел.
Я даже скрининг не прошёл туда, лол. Ну да, мотивирует хоть что-то начать делать. Я вот думаю, вкачать гитхаб и нетворкинг и пройти какие-то экзамены с сертификатами, чтоб вот этой хуйни с душными собесами вообще избежать.
Ну и сколько там платят-то мидлам в итоге, чтоб терпеть эту псевдофаанговскую хуету вместо собесов? Тыщ 200-то есть хоть?
ну и почему в вашем гадюшнике одновременно с этим цирком, сняли все вакансии на Go? Я даже оценить не могу стоит или не стоит мне участвовать.
Сколько раньше платили мидлам?
не прошел по софтскиллам - это когда полчаса на собесе не можешь держать себя в руках, не выдавая двачерскую натуру
и тимлид такой думает, что у него и так уже слишком много долбоебов в команде и нах нужен еще один такой
>Есть варики устроиться стажером\джуном, если на го вкатиться?
Сбер начал понемного гошников набирать на джунские и стажерские позиции. Яндекс тоже.
Из традиционного - озон, авито, wildberries. Больше никто особо не берет.
Попробуй по быстрому пройти го тур, забацать пет проект и податься к ним на стажировки. Если не получится, то придется учить новый стек технологий или ждать следующего года, когда снова гошников начнут набирать.
>Полагаю их также надо, как и двузначные операторы числа парсить
Нет, это костыль.
К тому же это не простая задача. Парсинг вещественных чисел довольно заебистая задача, лучше открой талмуды по компиляторам и посмотри там
Нет.
Как первый язык лучше брать питон или джаву/шарп. Питон просто чтобы научиться программировать. Джаву и шарп чтобы научиться ООП, чистому коду, чистой архитектуре, паттернам, техникам рефакторинга и прочим помойным легасным техникам, которые почему-то в Го очень не любят, но они все равно пригождаются постоянно.
> Джаву и шарп чтобы научиться ООП, чистому коду, чистой архитектуре, паттернам, техникам рефакторинга и прочим помойным легасным техникам
Мог бы проще - абстрактные фабрики синглтонов
> которые почему-то в Го очень не любят
Зависит от места, где-то всем рулят деды, которые пишут как на сишечке, а где-то перекатившиеся из Джаббы пишут по своим канонам
Я как вкатыш из питона и жс даже не знаю что хуже
Обычный C-подобный синтаксис. Я хочу написать сам, понять как они делаются, а не создать прорывной и удобный язык.
var x = 1;
const y = 4;
fn plus(x, y) {
__return x + y;
};
var z = plus(x, y);
if (z == 5) {
__return true;
} else {
__return false;
}
Да вы, батенька, гений! Вот тупые макаки, сидят токены посимвольно читают, ебалу какую-то с определением следующего символа придумывают. Хуйнул регулярку - дело сделано.
Ну, разве что в плане производительности говнокожу, да. Но зато код более читаемый
Почитай про грамматики, есть много разных генераторов кода токенизаторов текстов на основании описания правил грамматики.
200-250 на руки вполне реально
Я, конечно, вайтишник, и много не понимаю, но какой смысл так экономить память? Хорошо, пусть у тебя в теории могут быть десятки мегабайт исходников и ты хочешь потоковую обработку, но посимвольно-то зачем её делать? Неужели у кого-то задница отвалиться, если ты килобайт текста прочитаешь и будешь с ним работать?
Регулярные выражения очень часто избыточны, так же как и printf функции, потому что тянут за собой кучу проверок, преобразований, их стоит использовать, как временное решение. Не только ради экономии памяти, но так же экономии процессорного времени, что гораздо важнее.
Вообще, регулярки сделанны именно так, чтобы было легко преобразовывать их в машины состояний. Если делать это на этапе компиляции, то оверхед от них не так велик. Но почему-то нормальных реализаций подобного нигде, кроме common lisp и, с недавних времён, С++ нет. Нужен язык с нормальным метапрограммированием или много кодогенерации.
Состредотачиваться на протяжении многих часов сложно: обязательно что-нибудь да упустишь. Пусть уж лцчше компилятор по рукам бьёт, где можно. Кстати, const могли не добавить из-за возможных неудобностей с выражениями типа const chtoto, err := f()
А макросы не так неочевидны, так как в нормальных IDE можно посмотреть, во что они разворачиваются. А ещё иногда очень сокращают исходных код и избавляют от ненужного копипаста
> Кстати, const могли не добавить из-за возможных неудобностей с выражениями типа const chtoto, err := f()
В го константы это не то же самое что константы в js
Я заметил. И сразу же задался вопросом, почему такой полезной абстракции нет и в го
Так где
>Cамого МУЖЕСТВЕННОГО в мире языка Go
Мужики, у меня VS Code, и он почему-то на некоторых проектах начинает ругаться на импорты изнутри проекта, типа, "project/entity/server не найдено в GOPATH". Почему так, я не понял, package везде корректный стоит. Если в настройках переопределить GOPATH на папку с проектом, то ничего не меняется. Где я обкакался?
На пиратство деньги не нужны.
вот тут с ним воевал >>2283843 →
и не завоевал.
Просто перестал странные импорты использовать в go.mod.
Ты уверен что у тебя в go.mod все правильно?
Да, вроде как и в других проектах. Импорты-то не странные, просто модули из себя подключаю
>ждём на хайринг дей короч https://hiringday.avito.ru/go
Ох, ебал я такой хайринг дей.
Нельзя было тесты нормальные написать?
Задачка на sql - это просто издевательство.Один join, серьезно? Даже не левый ? Нормального ничего придумать нельзя было?
Верчение деревьев еще более-менее. Но проблема в тестах.
Я случайно понял, что полуготовый алгоритм проходит все тесты и отправил задание как сделанное. И так два раза.
И это уж не говоря о том, что деревья нормальный программист вертел только в школке, а обычно он вертит их на хую и копирует рандому либу с гитхаба.
Ты чоооо! У них же фааанг! Точнее МЯСКОТ! Ой, точнее... да хуй знает, сайт для барыг тарелками! Сижу также в авито-треде, что иронично
Для написания соснольных утилит для кручения облаков и написания кубера@докера
описывай на чем ты УЖЕ программировал.
расскажи побольше о проектах с конкурентностью, sql, докером, линуксом
Ты ведь ими уже занимался на другом языке? Занимался, да ?
Ну, на худой конец, деревья повертишь.
Только с sql работал, линухс в гробу видел.
Я даже не планировал в го вкатываться, если честно.
Блять, я как сишарпо-даун, рофлил над линуксами, а теперь прийдётся самому в него вкатываться. Какая ирония...
Человеком хоть станешь.
Мне срочно бабки нужны и статус айти-гребца. Потратил дохуя денег у бати без его ведома и он поставил ультиматум.
Это правда?
Нет.
Шарп ведь ещё
А нахуя тебе программирование тогда?
Ради бабла?
Я вот вкатился недавно. Думал, что со временем втянусь. Но чет нихуя интереса не ощущаю. И думаю куда дальше катиться.
Перекатился из Go в жабу.
Как раз нравится, поэтому пригорает от зоопарка языков, в каждом из которых чего-то не хватает или какая-то часть всрато реализована. что не мешает мне на них писать, впрочем
У prorobuf есть доп фитчи типа wrappers.proto или annotations.proto. Как я поняла, Они по дефолту спрятаны где-то не там где должны, в итоге импорт в прото-файл не происходит нормально. Я помню что я эту проблему уже решала руками копируя этот пакет в проект, но это, очевидно, не выход. Подскажите пожалуйста как вы это делаете, чтобы выглядело адекватно и красиво?
Огромное спасибо!
> поняла
> решала
сучка должна решать свои проблемы сама или признать превосходство перед мужиком.
признаю, помогай)
Где гибкость, где экспрессивность, где мета-очко все это, ебаный рот вашего суслика, ебал матерей голенг-разработчиков в анус.
Какие ещё гибкость и экспрессивность? Язык специально проектировали максимально тупо, чтобы его могли осилить дебилы, которые будут писать максимально тупой код без удобств и синтаксических фишечек, чтобы любой другой дебил мог прочитать.
>>299799
Я просто охуеваю уже от ебаного говна под названием голэнг вн ашем проекте.
Если всю мою попоболь попробовать выразить одной фразой, то я бы сказал так - в других экосистемах ты тратишь время на изучение, но потом появляется возможность избегать РУТИНЫ, в голэнг же пошли другим путем - нахуй изучать, рутина не так уж страшна.
Очко ебаное, говно.
Короче, анончики, я на изи прошёл рекрутёрское зно.
Дальше у меня собес с куратором через 3 дня скорее всего, а потом техническое собеседование.
Куратор будет проверять мои знания по
>пик1, пик2 и пик3
А сеньоры знание языка го.
Но проблема в том что во-первых я нихуя не знаю про го, а во вторых я хоть и изучал всю эту хуйню с пиков, но давно не использовал.
Анончики, дорогие мои, подскажите пожалуйста, как мне за 3-4 дня повторить весь этот кал? Особенно касается алгоритмов и дискретной матеши. А также как мне за такое короткое время хоть как-то познакомиться с основами языка? В вакансии писалось, что знание самого го не обязательно в принципе, но блять, она мне на собесе сказала, чтоб с основами я сам ознакомился перед собесом. Лол. Я вообще даже вчера в первой половине дня не подозревал что мне прийдётся всю эту хуйню повторить/изучить, так что я без понятия откуда начать.
И кстати, с линуксом я тоже не работал, хотя ей напиздел, что ставил его на вм.
Чё делать бля??? Отсосу с пруфами тому кто подскажет.
Хули ты нервничаешь? Не прошел? Да и поебать, вас дохуя, я один.
>Математика
Учебники алгебры за 10-11 класс. Или найди свои старые конспекты
>Дискретная математика, базовые алгоритмы, структуры данных
http://neerc.ifmo.ru/wiki/
>Паттерны
Просто загугли. Или почитай книжку банды четырёх, если будет время
>Основы го
Язык за несколько часов учится: скачала читаешь это http://golang-book.ru/, потом пользуешься https://gobyexample.com/, если непонятно, как что-то делать. Ещё можешь почитать это для общего развития https://habr.com/ru/company/vk/blog/314804/ - может помочь, если по языку будут спрашивать.
>Linux
За пару дней не освоишь; про команды пока почитай https://github.com/sudheerj/Linux-cheat-sheet, потом по ходу дела разберёшься
Спасибо, добрый анон!
>пик 1
лол это че за хуйня, это какой-то финтех или они просто навернули слов из оглавления учебника. на 99% уверен что затронут максимум пару тем которые затащить можно если когда-то в жизни видел
Меня тут математика смущает, она как будто только для работы с изображениями, аудио, видео подходит. Ну может еще часть от статистики.
Остальное в списке постоянно встречается. Нужно хотя бы помнить о том что такие вещи существуют, и их можно успешно применить для решения самых разнообразных проблем.
потому амортизация или подкидывают до четного. это детали реализации которые в спеке не описаны поэтому сразу шли нахуй если тебе говорят что будет 5 без указания версии
а я прочитал после того как пост написал. однохуйственно подкидывание только не до четного а по табличке
>Это не "амортизация", и не "подкидывание". Связано с затратами на реаллокацию.
такие противопоставления со "связано с" вместо приведения термина всегда интригуют. вообще в ссылке про алайн, а не реаллокацию говорится и мне кажется как с этим связан всем знакомый паддинг должно быть очевидно. но ты оставил меня в большом волнении почему амортизация апендов не может быть связана с затратами на реаллокацию
а какой у тебя бэкграунд? (для себя интересно, тоже вкатываюсь) есть опыт не в бэке, а в чем-то другом?
ррррряяяяя
ну проверь што он в PATH/GOBIN у тебя есть
мб там в настройках тогл надо включить или окно релоднуть прост или ктрл щифт п го рестарт лэнгуедж сервер
Это же база, блядь, знать надо
В первом случае как swap в c++ работает
Во втором ты присваиваешь num1 num2, а потом к num2 прибавляешь num1 в значении num2, тоесть работает как умножение на 2.
Вывод - ты дегенерат.
Ну да, Go - это такой компилируемый петухон, из которого кучу всего выкинули и добавили горутины и типизацию. Не плюсы и даже не шарп.
1) Ванильная Java - уже фактически труп. Учить её сейчас с нуля нет смысла, новых проектов на ней никто уже не начинает. Большое кол-во вакансий и высокие ЗП в данный момент, обусловлены её славным прошлым, большому кол-ву кровавого энтерпрайза в финтехе, телекомах и тп который нужно поддерживать и дорабатывать, и тем, что молодые разрабы в большинстве своём проходят мимо неё в результате чего имеется серьезный дефицит разработчиков.
2) C# медленно, но верно загибается, МС судя по всему будет продолжать активно развивать его, в результате чего он имеет шансы обогнать Java со временем. Т.е. проще говоря он будет терять свою долю рынка медленнее чем Java. Тем не менее учить его с нуля в 2022 тоже нет смысла, главный аргумент тут: он не используется в core-сервисах крупнейших IT компаний мира (разумеется, сама МС не в счет). Пока гугл, амазон или мета не перепишет свою инфраструктуру на C#, смотреть в его сторону тоже не стоит.
3) Думаю, что следующая троица: node+ts, kotlin и golang в течение нескольких лет практически полностью вытеснят java и c# с бэкэнда везде, включая банки, телекомы и тп. В конечном счете всё будет переписано на данных языках. Старые технологии местами останутся, если серьезные доработки не требуются, но с нуля разрабатывать на них уже не будут.
Поскольку, последние 5 лет я пишу исключительно на node+ts (до этого, немного разрабатывал на c#), в этом году я решил изучить golang. Думаю, что спрос на golang разработчиков вырастет в разы в ближайшие годы.
Напоследок, хочу поделиться с вами прекрасным постом на реддит который я нашел пока вентилировал данную тему. Там не только про dotnet ui фреймворки, но и про политику МС к разработчикам в целом (в хроме можно использовать встроенный переводчик, смысл остается вполне понятен) https://www.reddit.com/r/csharp/comments/f9i9hc/comment/firr467/?utm_source=share&utm_medium=web2x&context=3
1) Ванильная Java - уже фактически труп. Учить её сейчас с нуля нет смысла, новых проектов на ней никто уже не начинает. Большое кол-во вакансий и высокие ЗП в данный момент, обусловлены её славным прошлым, большому кол-ву кровавого энтерпрайза в финтехе, телекомах и тп который нужно поддерживать и дорабатывать, и тем, что молодые разрабы в большинстве своём проходят мимо неё в результате чего имеется серьезный дефицит разработчиков.
2) C# медленно, но верно загибается, МС судя по всему будет продолжать активно развивать его, в результате чего он имеет шансы обогнать Java со временем. Т.е. проще говоря он будет терять свою долю рынка медленнее чем Java. Тем не менее учить его с нуля в 2022 тоже нет смысла, главный аргумент тут: он не используется в core-сервисах крупнейших IT компаний мира (разумеется, сама МС не в счет). Пока гугл, амазон или мета не перепишет свою инфраструктуру на C#, смотреть в его сторону тоже не стоит.
3) Думаю, что следующая троица: node+ts, kotlin и golang в течение нескольких лет практически полностью вытеснят java и c# с бэкэнда везде, включая банки, телекомы и тп. В конечном счете всё будет переписано на данных языках. Старые технологии местами останутся, если серьезные доработки не требуются, но с нуля разрабатывать на них уже не будут.
Поскольку, последние 5 лет я пишу исключительно на node+ts (до этого, немного разрабатывал на c#), в этом году я решил изучить golang. Думаю, что спрос на golang разработчиков вырастет в разы в ближайшие годы.
Напоследок, хочу поделиться с вами прекрасным постом на реддит который я нашел пока вентилировал данную тему. Там не только про dotnet ui фреймворки, но и про политику МС к разработчикам в целом (в хроме можно использовать встроенный переводчик, смысл остается вполне понятен) https://www.reddit.com/r/csharp/comments/f9i9hc/comment/firr467/?utm_source=share&utm_medium=web2x&context=3
>3) Думаю, что следующая троица: node+ts, kotlin и golang в течение нескольких лет практически полностью вытеснят java и c# с бэкэнда везде, включая банки, телекомы и тп. В конечном счете всё будет переписано на данных языках. Старые технологии местами останутся, если серьезные доработки не требуются, но с нуля разрабатывать на них уже не будут.
Так а что зумеры сейчас изучают? Я вот си шарп дрочил, но го объективно лучше. А другие зумеры какие языки для бека учат? Пхп или питон какой-нибудь?
Пик 2 - результат выбора ff на пик 1.
>алсо старайся несколько офферов одновременно получить, это вообще изи 20-40% прибавка
Несколько оферов в твоем этом хайринг дее? Или от нескольких компаний? И как ты торгуешься? Мне чет обычно не предлагают поторговаться, когда я говорю что принял другой оффер, может потому что и так было около верхей границы вилок, хз хотя вроде один раз предлагали, в каспере
У меня так бывало:
- Я еще в Х собеседуюсь, офер должны дать Д числа
- Ок, держи в курсе, скажи сколько дадут
- Я тут офер от Х получил, дали М
После этого они как минимум дают столько же. Можно пойти в первую компанию и назвать им контроффер, ведь ты им тоже сказал что начал собеситься в Y и они тоже попросили держать в курсе.
Если чисто по гошке, то
Устройство слайса, как работает аппенд, отличие стрингов от слайсов байтов
Устройство мапы, как работает вставка/итерация
Устройство канала, как работает отправка
Устройство интерфейса, тайп асёршны, рефлексия
Как работают горутины, что происходит при блокирующих/неблокирующих сисколах, что в пакетах sync/atomic и когда использовать
Как работает шедулер, что за M:N, воровство жоб, когда шедулер может переключить исполнение горутины
Как работает гц, маркинг, фазы гц
Это вскодовские сниппеты, а не автокомплит. У тебя лсп совсем не работает или ты на приоритет снипетов жалуешься?
Да, language server не работает вообще. Только эти ебучие сниппеты. И проблема не гуглиться нихуя, везде пишут мол включи ls и всё, но там стоит эта ебучая галочка. gopls установлен.
попробуй поставить тупо все утилиты которые вскод в менюшке показывает
Джуны в Go - манямирок вкатуна-борщехлёба.
не обязательно. на джуна простят, если ты не знаешь как в точности гц/шедулер/каналы работают. на стажера могут про слайсы спросить, но про мапу/каналы/гц/шедулер вряд ли.
однако тут вопросов буквально на одну-две лекции, это реально все знать могут и должны.
но это база, на мидла/сеньора в дополнение будут ебать по реальным задачам и архитектуре.
Пайк ушел, Томпсон ушел, никакого развития. Топ контрибьюторов - ноунеймы, трансухи и телки.
Популярность падает, новой крови нет, либы не пишутся, на го2 все забили, а любое нормальное нововведение просто невозможно из-за уебищного фундамента.
Да, правда
Скатертью дорожка.
Харьковский? Видел недавно эту вакансию. Выучишь очень быстро го, если ещё не завалил собес то советую внутриности подробнее разобрать, как работают вещи по типу GC, планировщика, особенности работы с слайсами и мапами.
Обычная школьная программа + первый курс универа.
Придётся распаковывать в папку temp при запуске, драйвер sqlite не умеет читать байтики из ресурсов, только файлы или :memory:
ты хочешь чтобы бинарник себя модифицировал при изменении конфига? мне кажется ты лезешь в залупу
Да, лол. Завтра собес с лидом, а потом ещё технический собес. Ну надеюсь время будет хотя-бы пару дней между ними, чтобы разобраться во всём.
Это когда C вызывает B, которая вызывает A и если ошибка случилась в А, то я её отображаю как будто зафейлилось B? Зачем это?
я так и вижу делаешь такой опенфаел, опенфаел делает сискол, сискол фейлится, а опенфаел тебе такой "проброс ошибок наверх? зачем это?"
Получается всё так, как я описал?
Не понимаю почему нельзя вывести ошибку на уровне чтения файла (сискол же происходит не в моём коде, а в рантайме?)
То есть у нас допустим ошибка чтения из-за того что диск поцарапан или просто что-то не прокнуло, поэтому я вывожу на фронтенд не саму ошибку, а «что-то пошло не так, попробуйте снова»?
Тебе может пригодиться embed, если база ридонли. Но вангую тебе не нужна база для конфигов, тебе и дампа мапы в json может хватить
Привет! Я вкатуся и просто спрашиваю что имеется в виду под пробрасыванием ошибок наверх. Других языков не знаю и загуглить не получилось.
Я не пытаюсь спорить, просто хочу знать что это и как правильно это делать (на это отвечает вопрос «зачем»)
Ну допустим у тебя есть такая вложенность функций: f -> g -> h. Любая ошибка должна обрабатываться в f, ошибки которые будут возникать в g и h, должны быть просто возвращены, либо дополнены и уже потом возвращены.
Вот пример: https://go.dev/play/p/DMy24KHvoRk
Спасибо!
Аноны, я прошёл собес, лид сказал что будет меня рекомендовать.
Спасибо вам за советы, без них я бы не вывез.
Теперь у меня ещё один собес но уже чисто по го, так что тут будет легче подготовиться.
>>300184
Ну, вообщем, в требованиях было написано реально по существу.
Мы обсуждали алгоритмы, паттерны, потом когда я высчитавал какой алгоритм быстрее мне предел функции пригодился, логарифмы. Затронули теорию графов, принцип работы структур данных.
Потом мужик спрашивал как бы я охарактеризовал качественный код, моё личное мнение. Спрашивал с чем я работал, есть ли у меня реальный опыт. Ещё он задавал много тонких вопросов, таких, что сразу видно разбирается чел или нет.
поздравляю!
ты с нуля вкатился или есть какой-то бэкграунд, знание других языков?
прошлая работа в ит была? вышка есть?
Уж лучше вкачуся в Kotlin/Java backend, там явно посолиднее компании и проекты.
>Уж лучше вкачуся в Kotlin/Java backend, там явно посолиднее компании и проекты.
Вкатывайся.
Пиздуй на жаве своей писать.
Вали давай
Всё, прошёл ещё технический собес, где чел спрашивал буквально поверхностную инфу которую я в http://golang-book.ru/ узнал. Рекрутёрша сказала, что меня приняли, осталось только подписать документы и чё-то там обсудить ещё с кем-то.
>>303994
Ну я знаю c# c++ js и всё впринципе. Надо было только написать красивое резюме и повторить темы, указанные требованиях. А вообще мне реально повезло с интернатурой, и не могу сказать что надо, чтобы с нуля вкатиться на го жуниора, например.
Вышки нет, опыта работы тоже, но я сказал что делал писал код на заказ студентам, и они такие мол неплохо, неплохо.
Ну сказали типа во время обучения платить будут 600-800 даларов во время обучения 2-3 месяца чтобы было что пожрать и мы могли сфокусироваться на обучении, а потом средняя зп джуниора и собственно работа на проекте.
Я не знаю нормальная ли это практика, или просто мне повезло.
Просто я контактировал со знакомыми, которые устраивались на похожее обучение с трудоустройством на пхп и яве, и обычно, просто набирают группу студентоты на бесплатное обучение, а в некоторых компаниях берут в натуральное рабство, где ты должен отдавать 30-40% от зп какое-то время после обучения.
Как написать красивое резюме?
Какие петпроекты написать, чтобы включить в резюме? Правда, что без петпроектов нахуй посылают сразу?
HAC РЕKОМЕНДУЮТ ДРУЗЬЯM!!Добpый день!!!
Mы обеcпечиваем:быcтpoту и кaчecтво предocтавляемых услуг! Рaботу выполняют квалифицированные, чeстныe, вежливые рaбoтники. Гpaждaнe РФ и PБ! Cтоимоcть предocтaвлeния уcлуг догoвoрная oт 1300 p/cмeна. Как нaличный,тaк и безналичный раcчeт.
Прeдлaгaем качественные услуги за разумные деньги.В сфере строительства работаем более 15 лет!
У нас несколько проверенных временем бригад , которые выполняют качественную работу.
К выполнению работы подходим с душой и полной самоотдачей!!!Работа по всему Екатеринбургу и пригороде!!!
Как-то так.
//go:build
//+tag
если раньше все отлично было и отлично работало и просто с
//+tag
Потому что даже без Set жить крайне сложно.
Там вопрос был в том, что синтаксис or или and для тегов был очень неудобный + не очевидный. Можешь найти соответствующий issue на гитхабе, мне лень его искать.
>>305207
С дженерикам ждем покращщень, на сейчас есть только https://pkg.go.dev/container и внешние пакеты, всё на интерфейсах.
> Потому что даже без Set жить крайне сложно.
попробуй map[T]struct{}
>>305255
Покажи код, я такое не встречал раньше
Потому что в качестве ключа можно использовать только сравнимые типы, и нельзя использовать слайсы, мапы, функции
В тиньке нужно уметь решать олимпиадные задачи по программированию.
Не просто литкод и кодварс, а именно околоолимпиадные, на динамическое программирование.
Подавал 5 раз в тинек и каждый раз получал отказ. При этом сколько задач решено - никто не говорит. Просто говорят, что не прошел и все. И так каждый год.
>>306696
Была стажировка в wildberries и туда было не так сложно попасть. Сейчас не знаю. Яндекс, авито, озон, VK - будь готов к дрочеву на собесах, и скорее всего тебя не возьмут. Больше джунов и стажеров никто не нанимает, насколько мне известно.
> околоолимпиадные
> на динамическое программирование.
что может быть проще динамического программирования? это уровень литкода.
Пчел, ну если для тебя харды на литкоде кажутся простыми, то молодец, иди в тинек.
У меня решать харды не получается, как и у многих других, поэтому я заранее предупреждаю анонов, чтобы сильно не рассчитывали туда попасть, если они не олимпуси
Это подходит под уровень "литкод медиум"?
Я вот решал на литкоде медиумы на sliding window, деревья и списки, но имхо в тиньке задачи гораздо сложнее
Нет, это уже хард ещё и с ограничениями.
Тащемта, ты написал про динамическое программирование как про что-то ебическое, я на это и стриггерился.
Да понятно, что задачи уровня кузнечика решаются легко. Какая-нибудь двумерная динамика уровня хода коня тоже просто понимается.
Но этого не достаточно. Нужно уметь решать задачи уровня того, что я скинул. А это явно не 2-3 месяца и даже не полгода задроства на литкоде, а гораздо больше (для среднестатистического студента или вкатуна)
Любые попытки убить нейтив обречены на провал.
пиздато, пошел читать
Интересный конечно порог входа, а что по вилкам там, хрюша светила?
Если готов к таким заёбам — можно и в гугол устроится, как-то же они набирают при этом штат.
>Как дела в мобилках у go+fyne?
В мобилках — мёртворождённая хуйня без задач, там сплошной натив. Кроссплатформа — хорошо если 1 из 7 приложений по крайней мере на iOS, на ведре всем более похуй и её больше.
Тащемта, хочешь кроссплатформенные мобилки — велком ту флаттер. До первой задачи с камерой/датчиками/бохатыми пушами/итд — пойдёшь лобзать натив на обоих.
>В мобилках — мёртворождённая хуйня без задач
На декстопе — в целом можно всякие утилитки хуярить.
Мне не нужен кроссплатформенный код, я просто хочу вкатиться в мобильную разработку, только под андроид, без жабы, котлина, дарта (не нравятся эти языки просто).
Какой вообще долбоеб придумал сделать джаву нативной?
Это задачи на стажера. То есть где-то 60-70к за 40 часовую неделю. Во всяком случае до войны так было. Как сейчас и потом - уже неизвестно.
В штат в тинькофф идут люди с олимпиадным бекграундом - студенты физтеха и ВШЭ, которые по каким-то причинам не попали на стажировки в FAANG или в яндекс.
К слову, на мидла и сеньку вроде тоже просят решать довольно тяжелые алго задачи, но уже полегче))
>хочу вкатиться в мобильную разработку, только под андроид, без жабы, котлина, дарта
Придется учить котлин либо дарт. Чем они тебе не нравятся?
>Какой вообще долбоеб придумал сделать джаву нативной?
Нативная она в том плане, что была основным ЯП для разработки вплоть до 2018 года. Так-то там все на особой виртуальной машине работает.
Почему так сделали - в нулевые языков особо-то и не было, жаба была одним из самых популярных и очевидных вариантов.
>Чем они тебе не нравятся?
1) Структуры проекта, которые генерируют иде.
2) Иде, которые генерируют эти проекты.
Если бы была возможность использовать в вскоде котлин (с нормальной подсветкой синтаксиса), то возможно бы и стал его использовать.
Да, шиз.
>В штат в тинькофф идут люди с олимпиадным бекграундом
Тащемта, тогда понятно.
>К слову, на мидла и сеньку вроде тоже просят решать довольно тяжелые алго задачи, но уже полегче))
Я ахуел наверно от того и опешил. Вообще не представляю как на такое завести синек — там же воронка будет в стиле 1 из 1000.
а зачем нормальной компании нужны тупые программисты?
таким место у параш... на битриксе лендинги клепать
Внезапно делятся. Человек, который в 11 классе взял всеросс по проге будет в разы более обучаемым, чем обычное хуйло из СОШ и говновуза)
так утешают себя тупые, но не переживайте, вы тоже нужны и даже с определенным опытом на большие деньги. Но не во всех компаниях/проектах.
Если его заблокируют, то будет проблема для программирования в РФ в целом, а не только с Go, но размещать пакеты можно не только на нем или их можно загружать через VPN.
Мне больше интересно, будет ли Go востребованным, если закроют поставки компонентов, а аренду серверов за границей сделают невозможной, опять же из-за тех же санкций.
Такую информацию я не слышал, но все равно было бы интересно узнать.
>их можно загружать через VPN
Можно, но начинающие программисты на go вряд ли будут с этим заморачиваться.
Кстати, вся документация по языку на гугловских сайтах будет тоже заблокирована.
Там оракл с джавой ушел из России, получается го единственный востребованный язык будет (кроме него то только скриптопараша)
> будет ли Go востребованным, если закроют поставки компонентов, а аренду серверов за границей сделают невозможной, опять же из-за тех же санкций.
Думаю да, надо будет более экономно использовать ресурсы уже имеющихся серверов, то есть переписывать 95% массового пхп-говна на го. Битрикс просто удалять сразу.
1. есть официальный кеш пакетов, так что если только гитхуб сдался, то должно еще скачиваться
2. у больших компаний наверняка свой кеш есть, у нас недавно отключение от гитхаба уже тестили
3. кто-нибудь накачает пакетов через впн и поднимет свой
4. в крайнем случае будем жить на то что мы навендорили
меня вообще уже года 4 удивляет, что в рашке какой-нибудь яндекс еще не поднял свой аналог гитхуба
> меня вообще уже года 4 удивляет, что в рашке какой-нибудь яндекс еще не поднял свой аналог гитхуба
Щас поднимут, точнее распилят на этом денег, а по факту какой-нибудь гитлаб развернут, кек.
>Щас поднимут
Зачем? Гитхаб не приносит деньги, а яндексу нужны только деньги, выделять для этой задачи сервера в момент дефицита компонентов и санкций, они скорее всего не будут.
Приносит. Ты видел ценники на корпоративные лицензии? А битбакет с плагинами видел?
Какая аудитория будет у этого "Я.Хаба", Россия, Беларусь и кто-то еще? Откуда в этих компаниях будут деньги, чтобы поддерживать подписку? Такое может быть, только если государство решит проспонсировать, но решит ли оно? Для кого вообще, российские компании будут писать код, чтобы им платили деньги?
> Какая аудитория будет у этого "Я.Хаба", Россия, Беларусь и кто-то еще?
Да, рашка и Беларусь. А что? Сам поисковик тоже только у нас юзают. Да и хостинги многие выбирают рашкинские. Всё полностью частное, без гос.спонсирования.
> Откуда в этих компаниях будут деньги, чтобы поддерживать подписку?
А откуда у них деньги на битбакет?
> Для кого вообще, российские компании будут писать код, чтобы им платили деньги?
То есть ты думаешь, что рроссийске айти - это исключительно аутсорс?
Собственно вопрос, есть ли список пакетов отсортированных по популярности, чтоб заранее всё выкачать? У Rust есть
>Собственно вопрос, есть ли список пакетов отсортированных по популярности, чтоб заранее всё выкачать
Кто их поддерживать будет и зачем тебе пакеты, которыми ты не факт, что воспользуешься?
>>286748 (OP)
>Обновляемый список с пакетами: https://github.com/avelino/awesome-go
Насколько знаю в Go такого нет.
Если уж говорить про экономию ресурсов, то надо переписывать на Си. Он и к микрософту/гуглу не прибит гвоздями.
>Если уж говорить про экономию ресурсов, то надо переписывать на Си
Нулевая скорость разработки и работы.
Как ты это замерял?
К тому же на сишке куча готовых и стабильных библиотек, аналоги которых на go ещё нужно написать.
Эксепшенов.
>Как ты это замерял?
Это ясно, код на Си, если в нем используется взаимодействие с системой, перестает быть переносимым. Си не знает, что такое асинхронщина, не знает, как работать с сетью, не знает протоколы, он ничего не умеет, кроме работы с памятью и выводом данных. В отличии от го.
>К тому же на сишке куча готовых и стабильных библиотек, аналоги которых на go ещё нужно написать.
Для чего эти библиотеки, нужны ли они на беке серверов, иначе зачем они в го?
У меня появляется отвращение, если проект не в едином стиле, даже импортированные пакеты с неподходящим под него стилем, вызывают такое чувство и желание писать код пропадает.
Какой проект сделать вкатышу в go чтобы в резюме написать "базовое знание"?
Мимопхп додик
Напиши какой-нибудь микросервис, который принимает жсоны, обрабатывает их, сохраняет данные в БД и возвращает ответы.
>Напиши какой-нибудь микросервис, который принимает жсоны, обрабатывает их, сохраняет данные в БД и возвращает ответы.
Описал всю работу горазработчика.
Походу нет))
Оракл сейчас это в первую очередь их база данных и облака. Джаву пилят в openjdk люди из оракла и еще кучи других контор.
Думаю, если у вас нет анальной привязки к Oracle Java или их базе данных, то ничего не изменится
>будет ли Go востребованным, если закроют поставки компонентов, а аренду серверов за границей сделают невозможной, опять же из-за тех же санкций
Ну, в РФ сейчас выиграли те, у кого были свои сервера. Го брали обычно чтобы крутить на амазоновских серверах свои микросервисы.
для базового знания ну мб физбаз
Т.е. не сам синтаксис, а вся эта ебала с gopath, goroot что там еще юзается, импользования go mod для разработки своего модуля/для обычного импорта готовых в свой сайтик и т.д.?
Алсо, на русском теперь тур недоступен?
Ну и по желанию если есть, как конкретно реализованы каналы, как реализован хеш мап в го, в целом, начинку
Нихуя ты умный. Вот же ж гениально.
А вот еще, если вдруг по твоей ссылке на найдено будет
https://google.com/
>А откуда можно почитать с начала? Т.е. не сам синтаксис, а вся эта ебала с gopath, goroot что там еще юзается, импользования go mod для разработки своего модуля/для обычного импорта готовых в свой сайтик и т.д.?
>>312461
>Нихуя ты умный. Вот же ж гениально.
В документации все ответы на твои вопросы, что тебе еще надо?
Ну так подскажи точну ссылку, в которой описывается как реализованы каналы? Ну вот глупый, не нашел
>реализованы каналы
Зачем тебе знать реализацию каналов, когда язык "из коробки" кросс-компилируемый и их реализация плавает в зависимости от платформы?
Про то, как они работают написано тут
https://go.dev/doc/effective_go
Если ты будешь использовать массив байт для изменения символа, то ты изменишь только 1 байт, иначе тебе придется писать относительно огромную логику изменения символов из байт, а в го уже есть руны.
Как выучить Го? Я прошел весь оффициальный туториал.. А че дальше?!
хочу стать сеньором 10к баксов/месяц в ДС за 1.5 года!!! целую обнимаю!!!
Как выучить Го? Я прошел весь оффициальный туториал.. А че дальше?!
хочу стать сеньором 10к баксов/месяц в ДС за 1.5 года!!! целую обнимаю!!!
тогда какой правильный ответ?
gomobile рассчитан только на треугольники в опенжле? Как выделять текст? Как его вообще рендерить? Где формочки? Хуета без задач, а хайпа-то было уууу
что вообще с айти будет после последних новостей?
вот даже на стажера игнорят. или я настолько плох..
Озон, авита, вб.
Как были так и остались. Ну, пока что не закрылись, кто знает что в будущем будет?
А так го у нас не взлетел особо, увы.
Нах тебе задания? Сам себе не можешь выдумать? Для совсем элементарных уровня черепахи - codewars, посложнее на алгоритмы - leetcode, но практические знания тебе дадут только реальные проекты. Ну напиши мультиплеерную игру с чатом, например.
Да чтоб ты спросил блять, тебя ебет вообще? Отвечай на поставленный вопрос либо иди нахуй, сразу видно, что ты поридж до ненужных вещей дело есть.
Мне так проще, когда есть итог под темой в виде пары заданий. Но ты вообще залетный, раз такие
советы даешь
> мультиплеерную игру с чатом, например.
Ссу тебе на ебало.
Долбоеб пориджный, там задачи для отработки алгосов, а не по фичам языка. Ты вообще не понимаешь реквеста, увидел задачи и начал гнать очевидную хуйню про литкоды и прочее говно. Дебил.
Зайди в стд либу, посмотри как парсятся пнг и гиф. Напиши для нескольких других типов файлов и сходи нахуй, токсик
понравится, но если ты про изменение символа хочешь рассказать, то слайс рун упоминай. также про различия в итерации по строке/слайсу байт хорошо бы упомянуть
> Но ты вообще залетный, раз такие
советы даешь
С хуя ли? Я дал практический совет, в данный момент сам это делаю для изучения языка и всей его обвязки. Хули ты тут слюной брызгаешь? И зачем го учишь? По твоему поведению понятно, что РАБотать тебя никуда не возьмут, причём именно по софт-скиллам, кек. А больше половины нужных знаний в реальной жизни - это не сам язык, а обвязка вокруг него. Логирование, профилирование, инфраструктура, докеры-хуёкеры.
Есть слитый? Анончик, дай курсов на го, чтобы с проектами были
Структурированная информация с разобранными проектами в портфолио, которые можно показать на собеседовании.
Тому, кто по дружбе залетел на работу и его всему обучили, не понять таких проблем.
>напиши мультиплеерную игру с чатом, например
Есть гайды как писать такое и продумывать архитектуру?
Хочу написать клон агарио, но не знаю с чего подступиться
>Хочу написать клон агарио, но не знаю с чего подступиться
HTML+JS+API, более подробно google: "js как рисовать на странице", "js отправка запроса на сервер", "golang http сервер", "golang json", "js отследить событие нажатия клавиши", "js получить координаты курсора на странице" и т. д..
Научись пользоваться поисковиком.
В итоге получается фронтенд дрочево и немножко логики на бекенде. Так ведь?
Вообще стало казаться, что бекенд сейчас не более чем прослойка между фронтом и БД. Вся движуха на фронте сейчас.
Еблан хочет написать игру где внезапно нужна фронтэнд часть. "Ряяя, бекэнд сосет."
Как ты игру без фронтенда представляшь? Визуальную новеллу в консоли?
Чисто бекенд проект написать имхо невозможно, так или иначе придется на фронте очень много работы проводить, иначе твое говноподелие, отдающее кривые джейсоны, никому не будет интересно в принципе.
Не пиши никаких игр, ни мультиплеерных, ни каких бы то ни было ещё. Там всегда будет много клиента и мало сервера, потому что сервер в таких проектах в основном для синхронизации, и в итоге появляется ложное ощущение того, что
> бекенд сейчас не более чем прослойка между фронтом и БД
Например, в энтерпрайзе так никогда не бывает, там всегда дохуя разнообразной логики на бэке, а фронт - это сплошные однотипные формочки для вызова этой логики. Только такое сложно представить в качестве учебного проекта, так что да, ищи курс с заданиями, либо пиши какую-нибудь сетевую залупу типа P2P-мессенджера.
Так прикол именно в том, чтоб писать всё с нуля самому, без подсказок. Конечно, если ты будешь гуглить, ты может и готовые варианты найдёшь. А так набиваются шишки, опыт. Не, ну можешь писать физзбазы и притворяться настоящим программистом.
на сайте поменяли ожидаемый месяц релиза с февраля на март рофланЕбало
т.е. ты иммешь ввиду, что если loop'ом иду по строке, то получаю только индексы, а если по слайсу, то тупл (индекс, значение)?
Тогда я видимо не понимаю смысла подъеба в вопросе "Чем отличается стринга от слайса байтов"...
Вот докерфайл
FROM golang:1.16-alpine
WORKDIR /go/delivery
RUN go mod init ex123
COPY go.mod go.mod
COPY main.go /go/delivery/
RUN go build
CMD [./ex123]
EXPOSE 8080
ошибка следующая
/bin/sh: [./ex123]: not found
Я уэе весь на говно изошел, понимаю что где то в пути проеб, меня на все возможные варианты. Что не так ?
Вы че ебанутые? Что это за смесь паскаля си и еще какого-то говна? Вы че угараете каждый раз писать fmt.Println
почему нельзя просто Println
ебать ну и параша
> смесь паскаля си и еще какого-то говна?
Ты угадал, вот тут про это рассказывают: https://youtu.be/0ReKdcpNyQg
Имена в пакетах могут дублироваться, чтобы избежать коллизии существую пространства имен, если добавить возможность их отключений, как например, using в C++, то код станет говном, в котором будет не понятно, что и откуда.
Паскаль умер уже давно, но люди все еще его вспоминают.
>Вы че угараете каждый раз писать fmt.Println
почему нельзя просто Println
Поздравляем, вы доебались до столба!
Можно.
Попытался пощупать этот ваш джаваскрипт.
Вы че ебанутые? Что это за смесь си джавы пхп и еще какого-то говна? Вы че угараете каждый раз писать console.log
почему нельзя просто log
ебать ну и параша
Проиграл.
луп по строке идет по рунам, по слайсу байтов по байтам.
Собираешь в одном докер стейдже, запускаешь в другом
Вот на джаве, в спринге, я пишу хуяк @RestController, хуяк @GetMapping и все работает. А в говне как?
На 1С переписывать. Го, жс и шарп тоже умерли.
Он писал микропенисы на жабе, но не может написать их на языке, который, кроме микропенисов, ничего не умеет.
Справедливо, не сердись если че
копируеш существующий, декларируеш хендлеры, делаеш кодген, пишеш сервисный код и работу с БД. всё.
> копируеш существующий
Философский вопрос: как написали самый первый в мире микросервис на говне?
Экспериментальным путём.
Generics now present? May use?
Какое же говно синтаксис у дженериков.
Допустим в main инициализирую подключение к бд, надо как то получить доступ к этой переменной из другого пакета, чтобы каждый раз не передавать её аргументом, потому что это выглядит тупо.
Может есть какой то лаконичное решение?
Есть. Но проблема в том, что неизвестно какое из 20 решений на гитхабе выбрать (
И так во всем.
вы мне лучше скажите что там с wildberries ? пока шизомод не пришел
самое лаконичное - отсутствие передачи. То есть, глобальная переменная.
Боишься использовать глобальные переменные? Это у тебя после явы?
>wildberries
а они набирают? а то что-то гугл 0 нормальных ссылок на их стажировки\джуновские позиции выдаёт
В яве есть контекст DI, из которого можно взять коннекшен к базе, а в го вместо этого какие-то тупые костыли из девяностых.
Он имеет в виду, что с самим сайтом. По слухам, их ломанули хохлятские диверсанты и зашифровали нахуй весь бэкенд с данными. Всё, нет больше вилдбирриса.
>а они набирают
Раньше набирали.
>гугл 0 нормальных ссылок на их стажировки\джуновские позиции выдаёт
А они и не брали джунов почти. И стажеров тоже. Хотя в треде кто-то отписывался, что попал к ним на стажировку несколько лет назад, а потом его уволили оттуда.
Вообще практически никто сейчас не набирает джунов и стажеров, когда на рынок вывалилось очень много разрабов с опытом.
>>317617
>wildberries
Жидко дали в рейтузы и ушли в мир иной.
type Component struct {
db sql.DB
}
func NewComponent(db sql.DB) *Component {
return &Component{db: db}
}
Не благодари.
> num1
> num2
> num3
> num4
Эх, как же хорошо что не однобуквенные переменные, а то иначе было бы непонятно нихуя
Так вот, сколько ему памяти надо? Он просто не запускается
Написал в тестовом, требование - обмен картинками по grpc, ну дальше гугол и вот так и сделал. Но не взяли, т.к тогда в вебе не работал никогда, но зато взяли на питон.
Так и не понял, по каким критериям надо делить проект на микросервисы.
> Так и не понял, по каким критериям надо делить проект на микросервисы.
Его не надо делить на микросевисы без весомых причин.
95% любителей микросервисов - каргокультисты, как, впрочем, и любители того же СКРАМА.
https://www.youtube.com/watch?v=gfh-VCTwMw8
>Так и не понял, по каким критериям надо делить проект на микросервисы.
Любую высоконагруженную логику выносишь в отдельный сервис.
Адам Фриман Pro Go
Полное руководство по программированию
надежного и эффективного программного
обеспечения с использованием Golang. 2022г.
Как раз для меня всё разжёвано. Но там про дженерики ничего нет.
Спасибо
>Но там про дженерики ничего нет.
Дженерики вчера появились.
https://tip.golang.org/doc/go1.18
Потыкай по ссылкам, посмотри говносинтаксис, дальше должен понять.
Из плохого:
1) углубили гуглозонд, который встраивает прямо в бинарник ещё больше инфы о вас.
2) исходники у зависимостей теперь не все скачиваются (будете тратить дополнительное время на поиск и скачивание исходников, когда микрософт внезапно заблокирует гитхаб).
3) из-за дженериков время компиляции серьёзно замедлилось.
4) поломали совместимость со старыми ядрами линукса, теперь версия должна быть не меньше 2.6.32.
5) go get теперь не работает (куча прежних книг и документации с инструкциями по установке у новичков вызовет проблемы).
>5)
go install
А вообще эта ебля с модулями от релиза к релизу вызывает СЕРЬЕЗНУЮ ОЗАБОЧЕННОСТЬ
>углубили гуглозонд, который встраивает прямо в бинарник ещё больше инфы о вас.
как откл-ить7
Я бы лучше начал писать текущий проект без дженериков, а потом бы добавил по мере надобности.
Может потом через лет 5 аналог stream api завезут вменяемый и на го наконец станет возможно писать без постоянных унижений
Проще написать альтернативный компилятор, чем каждый раз искать и выпиливать явные и скрытые гуглозонды.
А ещё лучше использовать тот язык программирования, который не прибит к корпорастам, имеет множество компиляторов.
Неужели нельзя было раздуплиться и за полгода (или сколько там уже дженерики в бете были) запилить их нормально?
Вот, жрите, пример из го тура подсвечивается красным.
>Так и не понял, по каким критериям надо делить проект на микросервисы.
когда у тебя большая команда и нужен тайм ту маркет
Перезагрузи родителя, от которого твои терминалы рождаются, если не сработало, то перезагрузи родителя родителя или просто перезагрузи.
я детдомовский
Нет и не нужны.
А, ну да, как же я сразу не догадался, что язык греческий, все же и так понятно, ну да, точно! ЗАЧЕМ ИСПОЛЬЗОВАТЬ ОТЛИЧНЫЕ ОТ АНГЛИЙСКОГО ЯЗЫКА НАЗВАНИЯ В КЛЮЧЕВЫХ СЛОВАХ ЯЗЫКА?
Потому что это математический термин. Тебя же греческая лямбда не смущает? Так чего ты из-за иоты бугуртишь?
Пока что забей. Советовал бы их учить в последнюю очередь. Они в конце концов только на днях появились
Никаких.
Производительность ниже (из-за GC), размеры бинарников больше. Несколько дубовый синтаксис, например отсутствие тернарника чувствуется. Непривычная объектная модель. Гораздо меньше готовых решений.
В остальном Go действительно более прогрессивен и прост (в хорошем смысле).
-buildvcs=false, походу
платят больше, вакух меньше, код коллег более понятный, делаеш веб-хуйню весь день
До 24.02.2022 в целом можно было, если напрячь жопу и устроиться в какой-нибудь тинькофф или вайлбериз стажером.
Сейчас в тинькоффе гошную тему прикрыли, а валдбериз жидко пукнул и обмяк. Конторы поменьше просто закрылись или приостановили найм.
Поэтому лучше подожди пока военная спецоперация закончится, потом уже думай куда нужно вкатываться. Вполне вероятно, что придется вкатываться не в веб хуйню, а на завод.
Потому что вычисление происходит не так, как в математике.
a == b == c
true == c // если c - boolean, ошибки и не заметишь
>Сейчас в тинькоффе гошную тему прикрыли, а валдбериз жидко пукнул и обмяк
А что с озоном и сбердевайсис? слышал, что вроде им тоже нужны разрабы
Да.
Откуда нам знать, что там петухонщики курили.
Про сбер не в курсе. Сегодня слышал, что они вообще найм остановили на многих направлениях.
Озон вроде набирает стажеров, но хуй знает как туда попасть. Но если готов работать по 40 часов в неделю, то наверное озон нормальный выбор для тебя. Потому что стажеры обычно студенты, которые не могут столько работать.
>>320915
На старт набирают, но вот в финтех школе на полгода минимум приостановили гошные программы.
Да и то, ты знаешь сколько там на старт берут? Человек 15-20 от силы. А желающих около 5-10 тысяч. Раньше было проще выиграть грику и уехать чистить унитазы в штаты, один хуй получать будешь в десятки раз больше чем на стажировке в тиньке.
Ну я имею ввиду, что на языке кроме всякой банковской параши ничего дельного не напишешь, как на джаве.
Так что мешает-то?
Идиот, ты бы хоть ознакомился с чем-то, прежде чем спрашивать.
Раз ты не умеешь искать и читать информацию в интернете, тебе и в программирование дорога закрыта.
С чем ознакомиться?
Проекты, которые написаны на go: docker, kubernetes, yggdrasil. Всякие штуки написанные айтишниками для айтишников.
>Сегодня слышал, что они вообще найм остановили на многих направлениях.
А откуда инфа? я че то не слышал...
>Озон вроде набирает стажеров
Видел у них вакансию и в ней описание, что они рассматривают людей с других стеков для перепрофилирования на го....
Я тебе ещё раз повторяю: ты не умеешь искать и читать информацию в интернете, тебе и в программирование дорога закрыта.
Мне вот делать нехер больше, чем за тебя гуглить, если ты тот же ебитень не нашёл до сих пор, то ты хохол.
Помогите, пожалуйста, задачу со степика решить.
Ладно, я смог. Но в предыдущих уроках не было информации о создании беззнакового массива.
Я знаю, как решить без него.
Ну блядь, не качай сомнительные либы с одним автором.
Хотя да, что-то типа packagist не помешало бы.
А кто мешает 10 мейнтейнерам в сговор вступить и подосрать?
А каждую зависимость, у которой зависимость заебешься просматривать на предмет обновлений
> сомнительные либы
Либа с 1300 звёздами никак не тянула на сомнительную.
> с одним автором
Процентов 90 либ.
А что ты собрался для себя писать? На джаве так-то и игры можно писать, да и вообще почти все что угодно, десктоп утилиты, фронтенд и т. д., но другое дело, что для этого есть куда более удобные инструменты.
Кто тебе запрещает на го писать хуитки для себя?
Правда я не знаю, что ты собрался писать для себя. У меня как-то все идеи проектов были либо слишком масштабные (написать аналог викимапии/народных карт яндекса, распределенное хранилище с поддержкой SQL запросов и т. д.), где нужно въебать охуилиард времени и в итоге забить от бессилия, либо банальщина уровня телеграм ботов, который 3 раза в сутки парсит какое-нибудь авито и выдает результат парсинга пользователю, которая пишется на любом языке за пару часов.
Вообще не знаю, как люди находят идеи пет-проектов для себя. Может быть ковыряться в опенсорс либах и фиксить баги интересно + полезно. Писать что-то свое, нужно быть охуенным спецом с огромным багажом опыта.
Можно было бы импортировать без префикса github.com?
насколько нужно быть НЕ тупым в Go чтобы пройти собес
Зачем ты перед этим дураком распинаешься простынями? Ничего он не напишет, потому что не может даже нормально погуглить.
Ну Т.е. насколько сам http модуль справляется? Речь не о хайлоаде, но на будущее. Все равно всё заканчивается на cdn, хоть с прокси хоть без
>Я тебе ещё раз повторяю
Ты мне ничего не повторял.
>ты не умеешь искать и читать информацию в интернете, тебе и в программирование дорога закрыта.
Умею.
>Мне вот делать нехер больше, чем за тебя гуглить, если ты тот же ебитень не нашёл до сих пор, то ты хохол.
Вместо пруфов своих слов, ты высрал хуету.
> Умею
Зачем тогда этот троллинг тупостью? Я же прямо в своём сообщении, которое ты цитируешь, назвал фреймворк для игр, на котором их уже запилили энное количество.
Это же ты, местный ебанат, который в Си треде всех школьниками называл? Я тебя вспомнил, даже стиль текста такой же.
>которое ты цитируешь, назвал фреймворк для игр
Не назвал.
На хуй иди, идиот со сломанным детектором.
Бамп
Потому что в них пихаются все зависимости и весь рантайм. Много dll-ек в Go видел? Вот то-то и оно.
Бинарники скомпилированные под определенную систему можно запускать без дополнительных установок?
Да.
panic: runtime error: invalid memory address or nil pointer dereference
Разобрался. Я, конечно, не сторонник глобальных переменных, но без них в го совсем трудно?
А вообще как принято конфиги хранить в го?
В питоне, перле как правило обычный файл с расширением языка и там константами перечислено. Для куба, например, переобпределяется через yaml. А тут?
Json.
А тут ты должен каждый раз, когда понадобится одно поле из конфига, открывать файл, читать его целиком, закрывать, а прочитанные байтики парсить как json, из результата взять одно поле, остальное выкинуть. Иначе не Go Way.
В файлие .env
Так причем здесь терминал? Это же как-то через сам судо делается, остальные программы же ввод показывают.
1. Беру чистые исходники: https://github.com/Macronut/Pinocchio Ошибка:
main.go:19:2: local import "./dns" in non-local package
main.go:20:2: local import "./proxy" in non-local package
main.go:21:2: local import "./service" in non-local package
2. Поменял в main.go
"./dns"
"./proxy"
"./service"
На
"github.com/macronut/pinocchio/dns"
"github.com/macronut/pinocchio/proxy"
"github.com/macronut/pinocchio/service"
Ошибка:
main.go:19:2: no required module provides package github.com/macronut/pinocchio/dns; to add it:
go get github.com/macronut/pinocchio/dns
main.go:20:2: no required module provides package github.com/macronut/pinocchio/proxy; to add it:
go get github.com/macronut/pinocchio/proxy
main.go:21:2: no required module provides package github.com/macronut/pinocchio/service; to add it:
go get github.com/macronut/pinocchio/service
3. Закинул файл go.mod в корень исходников:
module github.com/macronut/pinocchio
go 1.18
require github.com/williamfhe/godivert v0.0.0-20181229124620-a48c5b872c73
Ошибка:
service/pinocchio.go:15:2: local import "../dns" in non-local package
proxy/mystify.go:17:2: local import "../net/ipv4" in non-local package
proxy/mystify6.go:13:2: local import "../net/ipv6" in non-local package
proxy/mystify.go:18:2: local import "../net/tcp" in non-local package
service/pinocchio.go:16:2: local import "../proxy" in non-local package
4. Меняю пути во всех файлах как во втором пункте. Ошибка:
proxy/proxy.go:52:2: array index 15 out of bounds [0:15]
proxy/ttl.go:20:6: TCPInfo redeclared in this block
/root/Desktop/openwrt6/build_dir/target-mipsel_24kc_musl/Pinocchio-0.1/proxy/mystify.go:21:6: previous declaration
proxy/ttl.go:26:6: htons redeclared in this block
/root/Desktop/openwrt6/build_dir/target-mipsel_24kc_musl/Pinocchio-0.1/proxy/mystify.go:29:22: previous declaration
note: module requires Go 1.18
5. Меняю go 1.18 на go 1.17 в файле go.mod. Ошибка:
proxy/proxy.go:52:2: array index 15 out of bounds [0:15]
proxy/ttl.go:20:6: TCPInfo redeclared in this block
/root/Desktop/openwrt6/build_dir/target-mipsel_24kc_musl/Pinocchio-0.1/proxy/mystify.go:21:6: previous declaration
proxy/ttl.go:26:6: htons redeclared in this block
/root/Desktop/openwrt6/build_dir/target-mipsel_24kc_musl/Pinocchio-0.1/proxy/mystify.go:29:22: previous declaration
Как чинить? На картинке файл proxy.go (ошибка proxy/proxy.go:52:2: array index 15 out of bounds [0:15])
1. Беру чистые исходники: https://github.com/Macronut/Pinocchio Ошибка:
main.go:19:2: local import "./dns" in non-local package
main.go:20:2: local import "./proxy" in non-local package
main.go:21:2: local import "./service" in non-local package
2. Поменял в main.go
"./dns"
"./proxy"
"./service"
На
"github.com/macronut/pinocchio/dns"
"github.com/macronut/pinocchio/proxy"
"github.com/macronut/pinocchio/service"
Ошибка:
main.go:19:2: no required module provides package github.com/macronut/pinocchio/dns; to add it:
go get github.com/macronut/pinocchio/dns
main.go:20:2: no required module provides package github.com/macronut/pinocchio/proxy; to add it:
go get github.com/macronut/pinocchio/proxy
main.go:21:2: no required module provides package github.com/macronut/pinocchio/service; to add it:
go get github.com/macronut/pinocchio/service
3. Закинул файл go.mod в корень исходников:
module github.com/macronut/pinocchio
go 1.18
require github.com/williamfhe/godivert v0.0.0-20181229124620-a48c5b872c73
Ошибка:
service/pinocchio.go:15:2: local import "../dns" in non-local package
proxy/mystify.go:17:2: local import "../net/ipv4" in non-local package
proxy/mystify6.go:13:2: local import "../net/ipv6" in non-local package
proxy/mystify.go:18:2: local import "../net/tcp" in non-local package
service/pinocchio.go:16:2: local import "../proxy" in non-local package
4. Меняю пути во всех файлах как во втором пункте. Ошибка:
proxy/proxy.go:52:2: array index 15 out of bounds [0:15]
proxy/ttl.go:20:6: TCPInfo redeclared in this block
/root/Desktop/openwrt6/build_dir/target-mipsel_24kc_musl/Pinocchio-0.1/proxy/mystify.go:21:6: previous declaration
proxy/ttl.go:26:6: htons redeclared in this block
/root/Desktop/openwrt6/build_dir/target-mipsel_24kc_musl/Pinocchio-0.1/proxy/mystify.go:29:22: previous declaration
note: module requires Go 1.18
5. Меняю go 1.18 на go 1.17 в файле go.mod. Ошибка:
proxy/proxy.go:52:2: array index 15 out of bounds [0:15]
proxy/ttl.go:20:6: TCPInfo redeclared in this block
/root/Desktop/openwrt6/build_dir/target-mipsel_24kc_musl/Pinocchio-0.1/proxy/mystify.go:21:6: previous declaration
proxy/ttl.go:26:6: htons redeclared in this block
/root/Desktop/openwrt6/build_dir/target-mipsel_24kc_musl/Pinocchio-0.1/proxy/mystify.go:29:22: previous declaration
Как чинить? На картинке файл proxy.go (ошибка proxy/proxy.go:52:2: array index 15 out of bounds [0:15])
>>325732
git clone https://github.com/Macronut/Pinocchio
cd Pinocchio
go build
Пропробуй, возможно ты что-то сломал, возможно проект уже сломан, но если в нем не указан алгоритм сборки, то все должно так работать. Или проект говно.
Попробовал другие исходники, теперь выдает:
cp -fpR ./files/ /root/Desktop/openwrt6/build_dir/target-mipsel_24kc_musl/Pinocchio-0.1/.pkgdir/Pinocchio/
cp: cannot stat './files/': No such file or directory
Открывал смотрел все файлы в исходниках - нигде нет пути ./files/* - что это может быть?
>Попробовал другие исходники
Какие?
>Открывал смотрел все файлы в исходниках - нигде нет пути ./files/* - что это может быть?
Очередное быдлокодерское решение.
Мне анон скинул починенные исходники, сказал что оригинальные исходники кривые:
http://0x0.st/oq98.gz
>Очередное быдлокодерское решение.
Можно это починить редактированием исходников? Я понятия не имею где искать, т.к. я не линуксоид даже близко, мне просто надо прогу скомпилировать и поставить на роутер. И заодно спрошу. Почему у меня убунта так сильно лагает на виртуалке? Когда перетаскиваю окна все тормозит и лагает, есть большая задержка. На винде-виртуалке такого нет даже близко. После моих 144 hz глаза дико устают.
>Можно это починить редактированием исходников?
Да.
>Я понятия не имею где искать, т.к. я не линуксоид даже близко, мне просто надо прогу скомпилировать и поставить на роутер.
Возможно проблема в используемом тулките для сборки, возможно проблема в том, как ты собираешь, возможно проблема в том, что проект написан индусом. Много причин.
>Почему у меня убунта так сильно лагает на виртуалке?
Убунта говно.
Я собираю через openwrt SDK. Как починить? Явно проблема в исходниках, потому что я уже успешно собрал это (тоже на GO):
https://github.com/BH4EHN/openwrt-cloudflared/blob/master/Makefile
Но тут уже готовый makefile был. Я создал по аналогии Makefile для Pinocchio
>в репе 0 го-кода
Там только makefile и конфиги. Исходники берутся отсюда: https://github.com/cloudflare/cloudflared
>Возможно ты не так собираешь.
Я все так собираю, потому что я уже собрал cloudflared, использую данный makefile: https://github.com/BH4EHN/openwrt-cloudflared/blob/master/Makefile
https://github.com/cloudflare/cloudflared/blob/master/Makefile
Обрати внимание на тело цели в строке 193.
Так оно не использует тот makefile при компиляции, оттуда берутся только исходники, а используется данный файл:
https://github.com/BH4EHN/openwrt-cloudflared/blob/master/Makefile
define Build/Compile
$(call GoPackage/Build/Compile)
Тогда удали нахуй строку $(CP) ./files/* $(1)/ из своего (созданного на другом) мейкфайла, чтобы убрать эту ошибку.
>cp -fpR ./files/ /root/Desktop/openwrt6/build_dir/target-mipsel_24kc_musl/Pinocchio-0.1/.pkgdir/Pinocchio/
>cp: cannot stat './files/': No such file or directory
Удалил, теперь ошибка:
Finding targets
go: warning: "github.com/macronut/Pinocchio/..." matched no packages
Building targets
no Go files in /root/Desktop/openwrt6/build_dir/target-mipsel_24kc_musl/Pinocchio-0.1/.go_work/build
В ошибке речь про GO_PKG:=github.com/macronut/Pinocchio
Возможно я не то указал, потому что в cloudflared путь немного другой:
GO_PKG:=github.com/cloudflare/cloudflared/cmd/cloudflared
Но я не нашел ничего похожего в github.com/macronut/Pinocchio
Ты вроде исходники менял, с относительного-локального пути импортов до абсолютного-удаленного (то есть на гитхабе), верни, как было и попробуй еще раз.
Удалил tar и запустил компиляцию, он по новой его скачал, теперь нет ошибок: (1, 2, 3, 4, 5) >>325726
Видимо они были из-за строчки: $(CP) ./files/* $(1)/ которую я удалил
Но ошибка осталась та же:
Finding targets
go: warning: "github.com/macronut/Pinocchio/..." matched no packages
Building targets
no Go files in /root/Desktop/openwrt6/build_dir/target-mipsel_24kc_musl/Pinocchio-0.1/.go_work/build
>go: warning: "github.com/macronut/Pinocchio/..." matched no packages
go mod init в директории с проектом пропиши, может поможет.
>в директории с проектом пропиши
Я не понимаю. В makefile? Компилирую через openwrt, не из директории проекта. Из папку openwrt. В ней папка package. В папке package папки программ с файлами, в том числе makefile на каждую. Компилирую командой:
make package/pinocchio/compile V=s
>/root/Desktop/openwrt6/build_dir/target-mipsel_24kc_musl/Pinocchio-0.1/.go_work/build
cd /root/Desktop/openwrt6/build_dir/target-mipsel_24kc_musl/Pinocchio-0.1/.go_work/build && ls -l
И листинг сюда, хуй знает, что там у тебя происходит внутри.
total 8
drwxr-xr-x 2 root root 4096 Mar 31 00:21 bin
drwxr-xr-x 3 root root 4096 Mar 31 00:21 src
Нет. Там в этот SDK все необходимые библиотики и утилиты ставятся в папку package. То есть язык GO ставится в папку package/lang/golang и тд
Сам SDK: https://github.com/openwrt/openwrt (это вроде как полная версия, через которую можно собрать на любую архитектуру, выбирается через make menuconfig. Есть еще урезанная версия на конкретную архитектуру, я пользую урезанную)
Пакеты: https://github.com/openwrt/packages (там же пакет golang)
Мне кажется проблема в том, что в проекте нет go.mod, попробуй форкнуть его и добавить его, а после измени мейкфайл, но уже под свой форк.
>в проекте нет go.mod
Есть в исходниках, которые мне анон скинул: http://0x0.st/oq98.gz
С ними такая же ошибка. Содержимое go.mod:
module github.com/macronut/pinocchio
go 1.18
require github.com/williamfhe/godivert v0.0.0-20181229124620-a48c5b872c73
Т.е. в питоне во фласке что-то типа
@blueprint.route("/url/<name>")
@blueprint.route("/url/<path:varargs>/<name>")
И могу обращаться к /url/123 и к /url/qwe/2345
Т.е. что-то вроде подкаталогов, которые формируются из бд/файловой системы
Так это для макоси скрипт. там даже в ссылке на гитхаб написано это
с другими двачевскими потихоньку заполняем такую халупу -
https://github.com/Planck1858/golang101
СУПЕР!
Что значат эти настройки? https://raw.githubusercontent.com/macronut/Pinocchio/master/pino.conf
service=socks//127.0.0.1:666 - на этом порте он слушает. Помогите разобрать остальное!
Вот ты ебешься с этой хуетой уже пару дней, а что эта программа вообще делает? Разве у нее нет нормальных альтернатив?
A local DNS server let TCP connection resolve hostnames through proxy by return fake IP addresses
Альтернатив на линукс не нашел. На винде такое делает Proxifier:
>it is impossible to get a real IP address through a proxy so Proxifier has to assign placeholder (fake) IP addresses like 127.8.. which are only valid within the local computer
Задача резолвить через родные DNS прокси. Proxifier это умеет. На линуксе все что находил это проги, которые тупо шлют DNS запросы на указанные DNS сервера, к примера гугла. Это вообще не то что нужно.
>https://github.com/macronut/Pinocchio/blob/e755902ca5890401b77dea5d0b0a20a98e9b0d82/main.go#L155
Быдло - это тот, кто писал такой код.
Другого на линукс нет, к сожалению. А отсылку я все равно не понял, т.к. я не знаю язык Go. Я вообще никакой код не знаю.
Можешь попробовать, поднять SOCKS прокси и через iptables контролировать конечные домены.
Будет такая схема:
"Машина во внутренней сети"->"Внутренний управляющий сервер с прокси"->"Файрволл на сервере, который запрещает пакеты на определенные адреса"
>На роутере?
Да.
>Что это значит?
Хуевые формулировки использовал, но кратко, то iptables позволяет указывать правила обработки пакетов, значит ты можешь с помощью него указать, чтобы пакеты отправляемые на example.org перенаправлялись на условный 192.168.0.255, но я не помню может ли он работать с доменными именами.
https://www.opennet.ru/man.shtml?topic=iptables
Поднимаешь SOCKS5 прокси на роутере, настраиваешь iptables на нем, на внутренних машинах указываешь соединение через SOCKS5 и адрес роутера. Должно работать.
Может я не так объяснил? Мне надо чтобы DNS шли от провайдера сокса, как на первой картинке. А у меня получается только как на второй. И при этом все нужно делать на роутере, без каких-либо манипуляций на компе.
У меня щас следующая схема на роутере.
1. На порте 1234 висит проксификатор, в конфиге проксификатора прописан сокс тайланда. TCP трафик отправляется на порт 1234.
2. На порте 5555 висит DNS сервер, в конфиге DNS сервера прописан DNS cloudflare, UDP трафик отправляется на порт 5555.
Что изменить в этой схеме, чтобы было как на первой картинке: >>326797
>>326800
Ты тупой? Ты когда подключаешсья к интернету, то тебе DCHP провайдера выдает свои местные провайдерские DNS сервера. В данном случае провайдер Contabo Asia Private Limited
>1. На порте 1234 висит проксификатор, в конфиге проксификатора прописан сокс тайланда. TCP трафик отправляется на порт 1234.
SOCKS5 прокси поддерживает UDP, почему бы тебе просто не перенаправлять все запросы на него?
>2. На порте 5555 висит DNS сервер, в конфиге DNS сервера прописан DNS cloudflare, UDP трафик отправляется на порт 5555.
UDP трафик это не DNS трафик, у тебя потенциальная утечка данных в сети получается.
>Что изменить в этой схеме, чтобы было как на первой картинке
Для меня это просто набор адресов.
>Ты тупой?
Нет.
>Ты когда подключаешсья к интернету, то тебе DCHP провайдера выдает свои местные провайдерские DNS сервера.
Если бы он мне их выдавал, я бы смог без настройки DNS сервера на машине использовать доменные имена, но я так не могу, а значит мне никто не выдавал DNS.
>мне никто не выдавал DNS.
Твой провайдер всем клиентам говорит прописать днс гугла в настройках адаптера?
>SOCKS5 прокси поддерживает UDP
Не поддерживает значит.
>Твой провайдер всем клиентам говорит прописать днс гугла в настройках адаптера?
Да или используются настройки на роутерах, которые он выдает.
>Не поддерживает значит.
https://ru.wikipedia.org/wiki/SOCKS5#Протокол_SOCKS_5
Поддерживает.
>Поддерживает.
Ты похоже реально тупой. Если бы он поддерживал, то я бы не пытался несколько дней скомпилировать pinocchio. Иди читай как работает DNS.
>Ты похоже реально тупой.
Скорее всего не я.
>Если бы он поддерживал, то я бы не пытался несколько дней скомпилировать pinocchio.
Ты выбрал хуевый проект, который был заброшен 3 года назад, не имеющим документации, с очень низким уровнем кода, засрал половину линукс-треда в /s, пытался написать Makefile на основе другого, но не решился почитать документацию по сборке Go программ для openwrt, вместо использования поисковика ты срешь на двачах.
>Иди читай как работает DNS.
Расскажи.
Вместо решения проблемы, ты обвиняешь других, какой же ты бездарный.
>ты обвиняешь других
Где? Я просто написал, что ты тупой. Теперь ты еще и балабол, потому что я никого не обвинял.
Спокойней, быдло.
Чем Go.
Что значат эти настройки? https://raw.githubusercontent.com/macronut/Pinocchio/master/pino.conf
ЛЮБЫЕ ПРЕДПОЛОЖЕНИЯ! НЕ СТЕСНЯЕМСЯ
Пошел нахуй долбоеб, ты заебал, тебя в /s попустили, теперь потом тут попустили, нахуй ты вообще продолжаешь срать?
Ты что-то путаешь, это тебя опустили и сделали обиженным.
Пиши здесь, все свои.
Тет-а-тет это в жопу или в рот? Согласен отыметь тебя в жопу за помощь.
>авито
а они набирают сейчас?
В озон уже месяц на позицию стажера динамят по 10 различным вакансиям :( просто не отвечают на посланное резюме
посмотри на их сайте прямо вакансии, там голанг вакансий много, без указания middle/senior в тайтле (такие отдельно тоже есть) и без требования коммерческого опыта
может в резюме дело, попробуй изменить, почекать гайды на резюме от HR, buzzwords побольше накидать, ожидаемую зп убрать
за бугром го ценится и очень развит, посчитай сколько репозиториев с голанг на гитхабе и звезд по сравнению с другими проектами, зп до 600к доходят
но в снг для ждунов все плохо, это правда, да сейчас у всех все плохо
Вакансий миллиарды.
Ну что, работал в провинциальном аутсорсе, занимался бэкенд-разработкой - C++ использовался в проектах чисто по идеологическим причинам. В команде ни у кого не было почти никакого опыта бэкенд-разработки, поэтому учиться было, в общем-то, не у кого. Чтобы не было стыдно перед забугорным менеджментом, начал читать всякие учебники и статьи про базы данных и распределенные системы. Потом случилось так, что решил искать новую работу. Написал резюме generic "бэкенд-разработчика", среди языков написал в том числе Го, который на работе использовался около двух месяцев - забугорный менеджмент захлестнула микросервисная лихорадка. На следующий день получил чуть меньше десятка предложений, выбрал самое интересное, скрыл резюме :-). Поболтали с рекрутершей, отсобеседовался пару раз и готово - теперь я Го-программист. На собеседованиях была только БАЗА - никаких вопросов по фреймворкам и бредятины в духе "готовы ли вы отдать жопу за дядю Боба 100% покрытие тестами и принципы SOLID".
На изучении и понимание C++ потратил довольно много времени - на работе никаких стайлгайдов не было, приходилось самому искать "стандартные" способы делать всё по-нормальному. Наверное, теперь я всё, что было специфично для плюсов, забуду, но это какая-то польза от этих поиском была, я думаю.
Перечитал пост, подумал, могло создаться впечатление, что резюме было в духе "и швец, и жнец" с максимумом баззвордов, но нет - оно было вполне честное, про каждую "технологию" писал продолжительность и контекст использования, уровень владения - типа, вот в этом хорошо разбираюсь, а с этим только использовал готовый SDK, и т. п.
Про Го была пара строчек, и честно написано про 2 месяца.
Те, кто набирает Гошников, не ждут КОММЕРЧЕСКОГО опыта 3 года именно на Го. В этом он выгодно отличается от условной Джавы, где для переката обязательно нужно будет дрочить Спринг и т. п.
>может в резюме дело
3 пет-проекта, шарю за Redis, Docker, GHA. Ожидаемой зарплаты вообще не стоит, хочется хоть за еду поработать чтобы опыт получить))
Приветствую гоферов. Подскажите - есть ли команда, скачивающая сторонние покеты, определенные в импорте? Или для каждого пакета надо использовать go install packagename?
Дан целочисленный массив nums, выведите на экран true, если хотя бы одно значение встречается в массиве как минимум дважды, и false, если каждый элемент различен.
Сижу уже сутки и перебираю разные варианты, свои додумки и адаптации из гугла, но что-то пока херня выходит. Отмечу, что тут даже не слайсы, а базовый массив только..
Как будто на любую вакансию могут взять любую макаку со 100%-ой вероятностью.
https://www.youtube.com/watch?v=-K11rY57K7k
Dmitry Vyukov — Go scheduler: Implementing language with lightweight concurrency
Какие ваши мнения по поводу go после февральских событий.
Касательно тех, кто не уезжает. Да никто не знает
Будешь ли ты считаться стажёром, если имел много опыта на других языках, а гошку только начинает изучать?
Ну а как без надежды на лучшее?
И правильно, джунов в пщ не берут.
Указывают.
Не понимаю, как писать. Нужно сравнивать каждый элемент с предыдущим, но я почему-то вылетаю за индексы + нужно сделать ветвление и возврат значения в лоб при совпадении
самое просто решение что приходит в голову -- сделать set и пихать в него инты. Если при очередном инте там число уже есть --- возвращаешь true
Ну вот почему он берет индекс массива, а не значение этого индекса? Что я делаю не так?
Ну вот почему он берет индекс массива, а не значение этого индекса? Что я делаю не так?
фастфикс, забыл скрин
for _, result := range(arr) это из голанга же конструкция? Не помню. Просто воспользуйся ей, зачем писать циклы через for ;;;, а еще у тебя ошибка во втором цикле j должен быть равен i, а не 1. Ну и ходить "в холостую", когда тебе интересен только есть-нет результат, такое себе.
>Дан целочисленный массив nums, выведите на экран true, если хотя бы одно значение встречается в массиве как минимум дважды
И еще задание перечитай, ты не правильно его понял, [ 1, 2, 1 ] - true, не обязательно они должны идти рядом.
чото ты нето понаписал тут. Судя по тому что я вижу --- твой алгоритм всегда будет говорить true, т.к. ты вторым лупом опять по всему nums'у (за исключением 0 элемента) проходишь
наивное решение это идти по массиву в лупе, внутри каждой итерации опять проходить по массиву и сравнивать текущий элемент с остальными ("остальной" - это если индекс внутреннего лупа не совпадает с внешним).
более правильно пройти по массиву, собирая мапу элементов и их количества. если количество больше 1, то выйти с false.
чисто технически можно собрать пройтись по лупу и собрать фильтр блума, потом пройтись по лупу и на каждый элемент-кандидат, на который луп отвечает "ну мб", делать фулскан как в первом случае например.
>потом пройтись по массиву и на каждый элемент-кандидат, на который фильтр отвечает
сорян слишком думал о залупе ничего не могу поделать
>>более правильно пройти по массиву, собирая мапу элементов и их количества
Не всегда можно просто взять и [в худшем случае] умножить потребление памяти твоей программой на x > 2. Если массив большой, и его можно менять, то правильнее будет отсортировать, а дальше тривиально.
Думаю что чем раньше начну решать задачи от бизнеса тем быстрее руки выпрямиться и быстрее скилл прокачивать буду.
Но пока чувствую, что знаний мало и пытаться перейти в другое направление засмеют.
Так вот в какой момент мне будет не стыдно пытаться перейти в другую команду? Как мне понять, что уже можно хотя бы на стажера идти проситься?
У меня же все есть опыт программирования на 1С ну это же хоть как-то должно тоже учитываться, что я чуть лучше стажера.
В общем какой-то сумбурный нервный поток мыслей надеюсь вы меня поняли
Везёт тебе. Попроси тимлида перекатить тебя и всё
https://habr.com/ru/company/habr_career/blog/659343/
Вопрос: такую зп джунам платят, даже тем кто с нуля вкатился, за счет высокой востребованности? или те кто вкатываются обычно имеют опыт в других языках и за счет доп скиллов получают такую зп
сходи к своему hrbp, скажи, что хочешь ротацию в гошечку. сюда-то что пришел?
в целом, джу-гошник может ожидать себе зарплату повыше, чем скажем джун-пыхер, но и перекаты накладывают сдвиг на статистику
каждый пыхер должен написать свой шаблонизатор
каждый джсер должен написать свой мини-фреймворк
каждый гошник должен написать свой роутинг
юзай что угодно популярное, для чего есть готовые миддлвари, которые не придется писать самому
net/http, gin, fiber, echo, etc
Да. Нужно небольшой скрипт написать, в котором пару действий не обязательно выполнять последовательно.
Собираюсь вкатиться в IT, опыта нет кроме школьного бейсика, матан и диффуры знаю, но технического образования нет
Golang подойдет или лучше другой язык выбрать для начала? Интересен бэкенд и важна зп
что за зонды, можно подробнее?
1. Да, доставь пожалуйста моар инфы про зонд, и как его выпилить на этапе компиляции? Может, есть какие-то флаги?
2. По поводу исходников у зависимостей тоже не понял, как не скачиваются, они же нужны при сборке твоей программы, нет?
вкатился с нулевым опытом работы за 35к стажером. потом повысили до 65к. с 11 месяцами опыта перекатился на 100к в другую контору. потом повысили до 150к. с 23 месяцами опыта перекатился на 260к в другую контору.
Ты откуда? Если из России то куда ты устроился? Тут компаний, которая джунов набирает можно пересчитать по пальцам одной руки
Кулстори
Да его за 2-3 дня выучить можно. Еще месяц на самые распространенные либы. Месяц на несколько проектов и при условии, что ты пишешь на другом языке - ты примерный мидл
Особенно, если на php.
Конечно мимо. Ты случайно прошёл мимо своего петухон-треда и попал сюда.
из москвы, вкатывался через один из двух маркетплейсов этой страны, о которых все слышали.
>>334538
го тур только прошел. пошел на собес чисто ради интереса, в вакухе было написано без опыта гошки, так что не старался изучить. я в целом мог себе какой-нибудь говноскрипт на петоне написать и простенький проект на сишке/плюсах поредактировать и чем where от having отличается знал, примерно так.
На Go вообще никакого кода, кроме серверного, не попишешь.
Если ты увидел, что Go компилируется в исполняемые файлы, и провёл для себя аналогию с C++, то эта аналогия ошибочна. И тем более ошибочен вывод, что Go можно юзать для тех же задач, что и C++.
Мне надо написать небольшую программу, в которой надо выполнять пару десятков действий (функций) одновременно. Выбрал этот язык из-за горутин. Какой компилируемый язык посоветуешь, чтобы нельзя было посмотреть содержимое самой программы?
Слушай, ну твоя программа будет простая же, я её просто декомпильну и разберусь че там как. Что у тебя вообще за желание "нельзя заглянуть внутрь" было бы желание на самом деле. Вирусню и ту разбирают как нехуй спецы, а ты залетышь вообще, подумой. Без негатива если че
Я не в курсе точно, но думаю можно покопаться в кишках и отключить вывод ошибок
А если по сабжу, эту проблему решает клиент-серверная архитектура. Не знаю применимо ли в твоем случае, но вариант возможный
Прост не могу понят когда есть смысл передавать объект через указатель.
по умолчанию в Гошке происходит копирование аргументов, когда передаешь их в функцию. Так что если не хочешь чтобы какой-то огромный объект копировался, передавай его по ссылке.
А вообще вот: https://www.practical-go-lessons.com/chap-15-pointer-type#when-to-use-a-pointer-receiver-when-to-use-a-value-receiver
Да вы заебали!
Ладно, с крашем я разобрался. Но теперь другая проблема, после того как клиент отключается, сервер уходит в бесконечный цикл
Научись основам.
Как там ГО поживает? Ещё встаёт с кален после обосрамса с неотключаемым лагучим сбором мусора или даже не пытается?
сап, какой язык взять для изучения(сейчас работаю говнарем)? был минимальный опыт c и java. Смотрю в сторону раст, но его синтаксис))))
>В обязательном порядке проходим Go Tour: https://tour.golang.org/welcome/1 (есть на Русском)
Где там на русском?
>игнорируем ошибки
>подключаемся один раз перед циклом и из цикла никогда не выходим
мне кажется всё должно работать))
Какой язык на рынке труда востребован, тот и изучай
var wg sync.WaitGroup
for i := 0; i < 5 (например); i++ {
wg.Add(1)
go func(sync.WaitGroup){
yourScript()
wg.Done()
}(wg)
}
wg.Wait()
В каких кейсах приходится копипастить? В принципе редко возникала такая необходимость. А сейчас еще и дженерики подвезли
Это называется строгая типизация
inb4(1): нет, я не перепутал со статический
inb4(2) да, баззворд
>нормальные пацаны по кайфу кастуют че хотят и во что хотят
Тред волшебников на другой борде.
> А как тогда всякие фильтры писать?
По твоему, на ORM можно сделать то, чего нельзя на чистом SQL?
squirrel или другие билдеры запросов, если не хочеш руками.
Он, видимо, ORM-фанатик, пришедший из какой-нибудь Джавы или Пыхи. На самом деле, положняк по орм такой:
ORM придумали программисты, которые не хотели "заморачиваться" с sql-запросами.
Подойдёт для "небольших" проектов (до нескольких тысяч пользователей.)
С ORM проще, пока запросы простые. Если нужна оптимизация и хайлоад, пишем запросы руками.
Вот и решайте.
> Go невозможно пользоваться в принципе, если не знаешь, как примерно такие же команды, которые делает Go, писать на голом ассемблере. Go-макака без знания ассемблера это что-то из разряда невероятного, я такое даже вообразить не могу.
> ORM-макака без знания SQL
Так ОРМ-ки, написанные сильными программистами, и порождают орды макак без знания эскьюэл.
0. Тяжелые времена порождают сильных программистов.
1. Сильные программисты создают фреймворки.
2. Фреймворки порождают слабых программистов.
3. Слабые программисты порождают тяжелые времена.
>ORM-макака без знания SQL это что-то из разряда невероятного, я такое даже вообразить не могу.
хз, вполне себе представляю такого недо-прогера. Решил что "Ептыть, а нах мне этот ваш селект инсерт, ОРМ делает бррр бррр..." и всё
Так фильтры — это часть круда, всегда так было же.
У тебя есть эндпоинт типа GetAllGovnoName и там нужна фильтрация, стандартная история. Есть куча способов запилить приличный API для фильтров без ОРМок (каким боком они вообще тут?). Естественно, и без всяких инъекций, если у тебя есть хоть одна извилина. На го это проще потому что строгая типизация.
>>348870
Настают тяжёлые. Так что всем быстро учить сишку с асмом, я не шучу.
>штобы это не плодило охуенно неподдерживаемый код
в чем SQL запросы "охуенно неподдерживаемый код"?
или я не понял о чем речь...
ну в зависимости от бизнес-требований это не "sql запросы", а 700 строк на генерацию одного запроса и собирание аргументов к нему по маленьким кусочкам и в какой-то момент это начинает внезапно ебать базу
>700
цифра из головы, или жизненные примеры есть?
Ни одного такого большого запроса не видел.
Да и элементарно, если бы ОРМки были быстрее и юзабельеней, то в вакансиях требовали бы их, а не знание SQL
из головы. в сумме там больше, но там три запроса в одной ручке и в каждом условия билдятся руками со всем соответствующим уровня часть форматстрингов начинается пробелами, а другая часть заканчивается.
Java всё еще быстрее считает числа?
Попробуй
Аноны, а почему в Го какая-то не понятная ебка с импортами? Будем пилить монолит по тиху и соответственно делать микросервисы на го, но тут я удивился, что НЕЛЬЗЯ ПРОСТО БЛЯТЬ ВЗЯТЬ И СДЕЛАТЬ ИМПОРТ, это вообще как? Почему я должен ебаться с какой то инициализацией модулей, я ни понимаю, нормальных гайдов как вот образно делать импорты как в питончике ? У всех в импортах какие-то репозитории, пакеты, бля, я просто хочу для начала иметь мейн откуда буду управлять остальными файлами, хоть как-то бля, но я в тупую не понимаю, можно по простому, для тупых, как работают в го импорты ?
"Ебаться с модулями" - это создать файлик на 5 строчек и пару папок. Уверен, что не осилишь?
Относительных испортов нету, да.
>НЕЛЬЗЯ ПРОСТО БЛЯТЬ ВЗЯТЬ И СДЕЛАТЬ ИМПОРТ
Философия golang - Data-Oriented programming, тебе дают минимум возможностей для выполнения операций с данными, привычный импорт это высоко-абстрактная фишка
В каких языках есть подобные механизмы len, cap для слайсоподобных структур? Когда при добавлении элемента увеличивается cap в 2 раза
В любом массиве (контейнере) в любом языке программирования. Можешь написать свою реализацию и расширять на 1, 2, n элементов каждый раз при добавлении нового, оптимальность этого решения будет зависеть от конкретного случая
>В каких языках есть подобные механизмы len, cap для слайсоподобных структур?
Плюсы мб? По сути слайс = динамический массив. Я не шарю за внутренность динамических массивов в плюсах, но думаю что идеология похожая.
std::vector в cpp
А что схожее с плюсами есть? В чём отличия? Насколько вообще база языка больше/меньше плюсовой? А самое главное надо ли мне это?
Не очень понимаю надо ли в Unmarshal ставить & перед data
Обычно все ставят, но и без этого работает. Какие подводные камни тут?
А я тебя предупреждал.
если передавать T вместо *T, то создавать объект через new не обязательно и можно просто объявить поинтер и анмаршал сам аллоцирует, если жсон корректный.
https://go.dev/play/p/wvfj9O9TdfG
ну линекс апреори нужно ставить
а так знание баша помогает спастись от ручного тестирования, когда ты можешь скриптом прогнать сотню разных запросов по двум версиям сервиса и сравнить их вывод.
плюс на собесах могут спросить по деталям, т.к. сервера всё-таки на линексах.
можно конечно на венде теорию дрочить но погружение все-равно лучше.
Аа понял про поинтеры, спасибо
>Если ты действительно знаешь С++
Ну и что сложного в мире GO, что нужно обязательно байты дрочить 10 лет? В Гошку с нуля легко вкатываться.
Указатели? Гошка сама преобразовывает значение в указатель незаметно для программиста. Работа с памятью? Гошка эффективно удаляет неиспользуемый стек из памяти. Типы? Насмешил, в гошке очень-очень простая система типизации, автокастинг это супер, ошибки выдаются понятно и просто.
Каналы? Ну каналы хз с чем сравнить. Горутины/каналы/многопоточность вот на что стоить уделить внимание, ящитаю
>>351783
Английский язык и погружение в Linux это первое, что делает программист
Да и на мидла нет нихуяшеньки. в РФ остались востребованным только сеньоры. рынку пиздец сейчас почти по всем языкам
Всё так, я тоже не рекомендую, ни в коем случае.
Это же американский язык для Гугла, а у нас гугла нет. Так зачем он?
НИНУЖОН
>сама преобразовывает значение в указатель незаметно для программиста
вообще пиздец, нахуй так делать, поначалу непонятно что происходит
Под "действительно знаешь С++" я подразумевал также знание алгоритмов и структур данных, которые были написаны челом на С++, ООП и работу с базовыми либами и памятью. Так что это просто хороший бекграунд для вката в го.
В Go даже списков нет из коробки
Всего три структуры данны: array, slice, map
Ну охереть вообще
А к чему это, я не понял просто?
В любом случае деревья, хэши и другие структуры данных нужно уметь писать под свои задачи
Это не те структуры, которые программист использует для решения задач
Кстати вполне возможно флешка то старенькая.
Спасибо анон сегодня схожу новую куплю надеюсь поможет.
И еще вопрос какой Линукс лучше ставить? Убунты мне с головой для начала наверное хватит, да?
Как-то сложно. Нужно будет потом еще строку разбирать получается. А можно для этого использовать например http, или что другие используют? Я просто совсем ньюфаг в go. Хочу например из qt передать на сервер строку, число и массив булевых, как такое реализуется?
Если я хочу добавить новый город, то мне нужно сначала сходить в репу со странами, удостовериться, что там есть нужная страна, а после в репу с городами добавить город+его страну. Но если у меня под капотом какой нибудь постргес, то я бы мог просто для таблицы с городами указать страну как foreign key одним запросом добавлять город, получилось бы более консистентно и скорее всего производительнее. Однако тогда, на мой взгляд, логика растекается и не получается изолировать одну сущность в одном классе.
Расскажите, как в таких ситуациях поступают умные дяди
не еби мозги и не разделяй репозитории по сущностям, разделяй по агрегатам.
я вообще не понимаю эту еботу с репозиториями на каждый чих. это какая-то ООП/клин код хуета. я обычно делаю одна БД = один репозиторий. вся более комплексная логика - обертка над ним. чтобы тестить зависимые пакеты вы можете интерфейсы и моки создать только с теми методами, что нужны. в чем я не прав?
Спасибо анон убунта встала дело и правда было в флешке
Не. Не алгоритмические, а на тонкости языка. Типа хитро..банной лапши из промисов и setTimeout-ов на ЖС, на прототипы и т.д. То что спрашивают примерно на среднем голанг собесе. А литкод решается на любом языке.
Слайсами ебут
Что-то не работает. Посылаю на сервер такую строку
> "{\n \"CPU\": \"Intel\",\n \"Motherboard\": \"MSI\"\n}\n"
На пиках код на сервере. Выдает пустые кавычки. На 3 пике вывод, если записывать в буфер.
Уже разобрался, почему то программе не нравилось, что имена переменных в структуре с маленьких букв.
К БД напрямую с клиента обращались в нулевых, тогда и серверную бизнес-логику писали на хранимых процедурах. Сейчас считается плохим тоном, типа плохо масштабируется. Но смотря что тебе нужно.
Дак может ты напишешь как надо и не будешь пальцы гнуть, вась? Я написал что мне нужно, разуй зенки и ответь нормально.
>может ты напишешь как надо
Зачем?
>не будешь пальцы гнуть
Он их гнул?
>написал что мне нужно
Уверен?
>ответь нормально
Зачем?
Ты с какой колонии такой дерзкий? Сидел? Родину любишь?
проиграл
по-хорошему между бд и юзером должна быть прослойка, чтобв не было робинов-брось-таблицу
также это позволит писать отдкльные методы для отдельных обращений, мутя всё что нажо под капотом, за красивым методом апи
>gui на go
Забудь
>Думаю вкатиться в го, для начинающего норм вариант?
Нет, пиздуй на питоне года 3 работать.
На Го джунов в принципе не может быть.
JS, плюсы, шарп.
>и на каких языках тогда писать гуй?
На любых, которые имеют адекватные фреймворки для гуя, а не костыльные, как в го.
12 лет пишу на пыхе и жс в одной конторе все это время.
Хочу вкатиться в го. Перепишу некоторые части с пыха на го. Таким образом получу опыт коммерческой разработки на го. Реально так дорасти до мидла и найти работу?
Потому что появились недавно, не обкатаны в проде и сделаны для языка, принципиально не преднащначенного ни для чего, кроме микросервисов.
Сравни "нативный" WPF/UWP и Гошные да подумай сам
>Что почитать на тему взаимодействия клиента и сервера?
Википедию.
>Как наладить их взаимодействие?
По протоколу.
>Вот есть десктопное приложение, мне слать запросы по tcp или по http на сервер, написанный на го?
См. 2.
rest api
grpc
Боже блять... ну кто и нахуя придумал вот это? Сука, многое стерпеть в ГО могу, но это выше моих сил блять. Имел опыт с JS/TS, Питоном и Жавой - везде по-человечески отрабатывала обработка ошибок
Как вы это жрете нахуй?
Деды с процедурной парашей в 70-х тоже так делали.
исключения убоги, усложняют понимание кода и замедляют его
ошибки как значения - шик и гарантия, что у тебя приложуха не упадет в рандомный момент времени, а все корректно обработается на правильном уровне
>>357348
есть, но пропзал отвергли
strconv.Atoi(str)? - делает return c дефолтными значениями и ошибками
strconv.Atoi(str)! - паникует в случае ошибки
>strconv.Atoi(str)! - паникует в случае ошибки
Тогда лучше так, v, ! = strconv.Atoi(str)
Все равно говно.
Просто запомни, что все ф-ции в гошке возвращают два параметра
Когда запускаем горутины через go - та же тема, но почему в случае каналов мы передаем сразу канал без всяких указателей, но работаем все равно с одним и тем же каналом, т.е. копирований не происходит?
https://ideone.com/Uc8M2U
Из с++ там только дроч с указателями. Да и то до сишного уровня ему далеко
https://ideone.com/Hmrog1
Далеко в плане он не так хорош?
И в байтах поковыряться и в вебе-хуебе джсоны маршировать в одну строчку
Есть одна фундаментальная проблема.
Даже ДВЕ.
1) РЕДКИЕ, обновления
2) Язык всё никак не созреет. Дженерики за год добавили, заибися. А комьюнити много о чём просит, всё это игнорят.
Нет, не пытался никогда, он всегда претендовал исключительно на веб-жсоны. То, что го компилится в экзешники, ещё ничего не значит.
Ну а как-же все эти вскукареки про Http-Траффик, каналы и прочее? Оно ведь не нужно в вебе
Нужно, если ебёшься с высоконагруженными микросервисами, ты в любом языке для бэка будешь аналогично ебаться. А можешь писать на го круды и не столкнуться с этим никогда.
А теперь главный вопрос.
Насколько в гошке популярны круды и фреймворки для веба?
Чтобы раз-раз как в джанго\рельсах и готово?
Какой процент вакансий? А ОЗОН?
Вот да! Выучить всегда можно язык, вопрос в востребованности, хз просто есть ли смысл учить и дальше
Все в один голос пишут про "микросервисы" как подавляющее применение в РФ. Хз что там ОЗОН намешал.
Перекладывать жсон на JS куда приятнее и проще. И либ проше
хз, особой разницы такой не заметила, хотя всего то на джанго и ноде писала
Просто разница возможно в скорости. Ну и еще за время изучения заметила, что от го так и веет мыслью мол "я дам тебе пизды, если будешь тратить память компа на не пойми что"
наверно все же стоит продолжить изучение, язык только-только обороты набирает
>язык только-только обороты набирает
Не знаю, по статистике падаю вакансии с марта очень быстро.
В полтора раза уменьшилось за один только апрель.
Джуном вкатиться нереально, но я бекендер тоже на ноде
вот бичевский метод расширения динамического массива, норм? или его лучше по-другому имплементить? И как его через дженерики для произвольного типа написать? interface{} нахуй
просто щас открыла ххру
на всю страну 37 вакансий на го без опыта
от 1 до 3 лет - 448
от 3 до 6 лет - 653
Джуны никому не нужны короче
Дженерики с типом constraint
Тут есть рациональное зрено, но все не совсем так
Пистон нужен в машобчике и датасоенсе. Но в беке его позиции слабы сейчас. Та же гошка стремительнее развивается
Вот, ты прямо телепат. Я именно со стороны "обычного" бекенда и пишу. В "обычном" бекенде без машоба\нейронки\дс там даже руби может потеснить
Последний раз была 40к на питоне.
Потом свалил в ноде, сейчас 150к. На питоне сильнее ебали на собесах, вот и забросил.
Сейчас думаю вернуться в питон (заново учиться) или в гошку вкатываться
Ты фуллстек? Где нашел работу в ноде? Там вакух еще меньше чем в питоне, в основном это фуллстеки.
Я редкий зверь, чистый бекенд на ноде.
Ебать какое гавно я видел. После этого всё желание в JS/TS развиваться НЕТ. Не нравится, всё очень плохо. JS раковый и только для фронта сойдёт, на нём писать нельзя, даже TS не спасает. Это не тот инструмент для бекенда, я ошибся
>open source go project
Потому что всё что создаётся через make ведёт себя как ссылочные типы.
В гохе написал свою реализацию вот этого: https://go.dev/tour/concurrency/8 тут нужно через горутины параллельно обойти 2 бинарных дерева и сказать, идентичны они или нет. Обход это обыкновенный поиск в глубину, тут все ясно. Проблема именно с синхронизаций каналов.
В горутине я сбрасываю данные в один основной канал, в конце горутины делаю defer который отправляет с qCh (quitChannel) данные, это как бы должно сигнализировать о завершении одной из горутин, но блять именно на этом моменте возникает дедлок! (fatal error: all goroutines are asleep - deadlock!) Какого хуя?
Вот эта хуйня с функцией sendToChannel нужна потому что для defer нужно указать именно вызов фуннкции
>нужно указать именно вызов фуннкции
лямду defer func(){ ch <- true}() туда вставь проста епта.
по вопросу хз без кода непонятно ты может из канала один раз читаешь, а шлеш туда два раза
давай с уникальностью по компаниям. не то чтобы сильно поменяется, но без опыта могут одну вакуху на несколько команд поставить, а с опытом в конкретные.
Расширение в будущем, потому что не все ошибки являются критическими, а значит некоторые можно без проблем обработать.
почему это не написать в будущем?
1. err != nil это кусок залупы. Обрабатывайте наконец эксепшны как все Белые Люди. (и да, defer был высран именно по причине отсутствия try-finally)
2. Почему бы не запилить наконец нормальную итерацию по строкам? Сука, в этом говноязыке даже по строке не можешь нормально проитерироваться, т.к. итерируемся мы по байтам. Без сторонних либ и рюмки водяры не разобраться.
3. interface{} это не "мощная фича" это ебаный костыль, которому не место в статически типизируемом языке.
4. null pointer exception это самая частая причина вылетов в рантайме, го не только ничего с этим не делает, но и всячески поощряет их, утверждая что достаточно "просто каждый раз проверяться на nil" (вспоминает пункт 1)
Толсто.
ну всё убедил я увольняюсь
>2. Почему бы не запилить наконец нормальную итерацию по строкам? Сука, в этом говноязыке даже по строке не можешь нормально проитерироваться, т.к. итерируемся мы по байтам. Без сторонних либ и рюмки водяры не разобраться.
pic
Или ты что-то другое имел в виду?
Установить ключ, заранее известный клиенту и серверу, им всё шифровать.
t := &http.Transport{
TLSClientConfig: &tls.Config{
Certificates: []tls.Certificate{cert},
RootCAs: caCertPool,
},
}
?
сначала да, но через год работы за еду ты уже крепкий джун и можешь претендовать на зп 80+
Когда итерируешься по строке, ты итерируешься по байтам а не по символам. Можно при помощи либы strings итерироваться по рунам (символам) но вот если 1 символ у тебя будет 4 байта скажем то ты опять обосрешься.
Что сложного сцуко было сделать по дефолту кодировку у всех строк utf8? Если нужны другие - преобразуешь при помощи той же либы encoding. От того они и строки блять. И завезти отдельный тип bytes (в общем почти как оно сейчас и есть, byte это шорткат для uint8), который интерпретировался бы как массив байтов. Вместо этого какое-то невнятное ковыряние байтов там, где оно нахуй не усралось.
толсто
Не думал бегать начать? Чтобы лишний вес сбросить.
> go get -u github.com/gorilla/mux
Ругается, что надо использовать только в папке с mod, предлагает команду install. Окей, использую её, в итоге в $GOPATH/pkg/mod/github.com/gorilla появляется папка [email protected] А что с ней делать? В goland пакет все равно не видно. Почему так сложно всё? Пакет mysql я просто кинул в папку Program Files/go/src и заебись, везде подхватывается.
мб как-то так импортировать? я кнш новичек только, но похоже mysql пакет он ищет в пути goroot, а mux - в gopath (т.к. в goroot нет)
второй вариант поменять gopath, а вообще да, удобнее go.mod юзать
сделай модуль в папке с проектом. У тебя Пщ не понимает куда ему модуль с мухом сувать
>Пакет mysql я просто кинул в папку Program Files/go/src и заебись, везде подхватывается.
господи...
Go++
>Что не так?
если это какой-то изящный способ мазохизма -- то окей.
Все модули должны через go get ставиться, а не через такое мозгоебство
Хоти.
это обязательное условие?
Обычно с него и вкатываться. Хз, видимо похожи
Пагинация
Двачую пагинацию. Но если ты ёбнутый, врубай chunked:
```
w.Header().Set("Transfer-Encoding", "chunked")
w.Header().Set("X-Content-Type-Options", "nosniff")
```
После этого после каждого row дёргай `(w.(http.Flusher)).Flush()`. Соотвественно у тебя в ответе будет не один json, а стрим json-ов.
К слову, на приёмнике, если он на go, не пересоздавай декодер, используй один для всего стрима - у него есть внутри буффер и ты будешь проёбывать данные иначе.
1. Не оставляй за собой висячих на канале горутин. В false-варианте обе твои Walk-горутины утекают.
2. Пушь значения в канал правильном порядке. Прочитай доку и код Tree
3. У тебя закрытие канала уже является сигналом конца обработки. quitChannel не нужен.
Теперь про дедлок. Деферы выполняются в обратном порядке. У тебя получается что обе Walk-горутины обработали деревья и теперь ждут пока кто-то прочитает quitChannel. Но Same-горутина в этот момент залочена и ждёт нового x, которого уже не будет. Варианты локально разрешить примерно следующие:
1. Поменять порядок деферов в Walk
2. Сделать каналу quitChannel буфер хотя бы в одно сообщение, но лучше в 2 (`make(chan bool, 2)`)
3. Выпилить quitChannel.
Один из вариантов решения - https://go.dev/play/p/HfdSANOkRvF
Можно без stop-канала, если не нужна ленивость, тогда в if надо делать `res = res && false`
Теперь попробуй запилить то же самое для деревьев потенциально разных размеров.
ну зависит от контрактов и требований. можешь залить в хранилище и отдать ссылку и пусть хранилище ебется с этим вопросом. можешь тупа всё отдать, ты как будто никогда файлы больше 100мб с интернета не скачивал. текстовое можешь гзипом сжать, он в стриме кодируется/декодируется. у нас в сервисах да обычно пагинация.
Блин, внутри select и switch вообще говоря не нужен break, в отличие от множества других ЯПов, однако сцуко он там все же может быть и влияет на сам switch/select, поэтому когда запускаешь select через бесконечный цикл то break в нем не остановит цикл for, он подействует на select. Походу надо всегда из оборачивать в функции и выходить из нее через return
Альфач берет и отсылает целиком. У тебя комп уже давно тянет многие сотни Мб трафика. Не рефлексируй.
time.Sleep(time.Duration(rand.Intn(2)) * time.Second)
Отправит его поспать на либо 2, либо 1 либо 0 секунд. А как мне замутить равномерное распределение? Если внутрь time.Duration поместить вызов rand.Float64 то он автоматом округлит его до 0
ебать гнилым сиговном пахнуло. вот что бывает, когда допускаешь ссаных бумеров до руля. засерают всё своими протухшими концепциями
Лул))0) А ты как собираешься делать break/continue из вложенного цикла? Булевские флаги заводить? Вот пример, имхо первый вариант-то получше будет. Тем более если вложенность 3+.
Любой нормальный язык имеет похожую конструкцию, даже зумерские котлин и свифт.
А блять, в жс и пистоне привык что сразу передаю целиком float число и ниебет
(какого хера кстати надо оборачивать вызов rand.Intn в time.Duration? Эта пизда говорит что якобы "invalid operation: rand.Intn(3) * time.Second (mismatched types int and time.Duration)" - как только меняю rand на обычный int все компилится и запускается)
Потому что литерал не int, его тип подбирается под место в котором литерал написан.
https://go.dev/ref/spec#Constants
An untyped constant has a default type which is the type to which the constant is implicitly converted in contexts where a typed value is required, for instance, in a short variable declaration such as i := 0 where there is no explicit type. The default type of an untyped constant is bool, rune, int, float64, complex128 or string respectively, depending on whether it is a boolean, rune, integer, floating-point, complex, or string constant.
Ну так в го редко берут вкатунов. Я хуй знает кто и зачем тебе его посоветовал. Из после 2 лет питона в го заходил вообще.
Странно, что в языке предусмотрены теги для json, а для sql нет.
result := [][]int{}
Метод append же блять не мутирует а возвращает новый массив. Даже если указали ебнуть, все равно на выходе у меня получается пустой массив result. Походу в гохе на таких задачах только через каналы работают, да?
Задача вообще даунская - дана матрица nхn:
matrix [n][n]string
Вывести все индексы в формате {строка, столбец} элементы которых равны заданному target
Можно пройти все через вложенные циклы for, но очевидно что в гохе такое лучше делает через горутины - ебануть n горутин которые бегают по разным строкам и получить конечный результат
Принято, с этим проблем нет. Не понял, как именно ты пытаешься наполнять result. Скинь код что ли.
Если очень надо передать слайс в функцию и там в него что-то записать, то можно как на пике сделать, но вообще так не делают обычно.
>Даже если указали ебнуть, все равно на выходе у меня получается пустой массив result
так ты не присваиваеш результат исходному слайсу, а наверняка новую переменную создаешь. у тебя на выходе должен быть слайс с неопределенным числом элементов, а не пустой. без канала тебе как вариант нужно сразу слайс с N=n_горутин элементов сделать и каждой горутине сообщить индекс в который она пишет.
here, probably, on every post about the vkat, they write that the juns are not fucking needed.
you need to roll into the goshka like this:
- you learn pluses/peton/chart/javu
- looking for vakuhi in this language
- you notice a vacuum in the goshka
- you go to social services for goshka, specifying that you learned another language
я короче пост выделил и уменя гугл транслейт выскачил ну короче сорян
sqlx/gorm/куча остального чем я не пользовался
>устроился на новую работу
>куча задач по "продукт должен Х", "если Y, заказ должен Х"
как вы с этим живете? я привык жсоны перекидывать между сервисами/бд, а не этой продуктовой хуйней заниматься, которая для ебанов с 1С/сишартом/жавой.
ну хзхз, вот прямо ваннаби после курсов условные никого не интересуют особо.
а вот если производил деятельность разработочки по шаблонам проектирования на %framework_name%, имеешь в целом хорошие хардскиллы, возможно разрабатывал что-то гибридное Django x Golang - тогда вы действительно что-то представляющий из себя кадр, и будут готовы рассмотреть кандидата даже если про гошку увидел первый раз в вакансии, но в целом обучаем.
Но вкатуны почти вообще не особо, как в начале написал. Полгодика назад может было и да, но сейчас компании максимально сокращают расходы и не распыляются на инвестиции в стажеров как раньше. Интересуют только хардскилловые ребята с которыми не нужно будет возиться и тратить время на раскачку.
Скастить бизнесовые требования в ТЗ - задача аналитиков и продакта. Провалидировать успешность такого каста - задача продакта, лида и тебя. Если скастилось хуёво, то рекомендую отнести задачу обратно лиду. Если тебя сагитируют побыть аналитиком, смело увеличивай сроки выполнения задачи в 1.5 раза.
Если задача связано с регуляторкой - в 2 раза минимум, также перед реализацией надо будет провалидировать самописное ТЗ об кого-нибудь, ибо времени переделывать такие задачи как правило нет.
> Обрабатывайте наконец эксепшны как все Белые Люди
Белые люди давно перешли на Result и Optional.
Если надо защититься от долбоёбов - есть recover.
> defer был высран именно по причине отсутствия try-finally
defer - это минимальная реализация scope(exit). По смыслу он больше похож на cleanup-аттрибут в gcc.
> Почему бы не запилить наконец нормальную итерацию по строкам?
По строке можно итерироваться через индексы или через range. Через индексы ты итерируешься по байтам, через range - по символам.
> interface{} это не "мощная фича" это ебаный костыль, которому не место в статически типизируемом языке
Стирание типов вполне себе фича статически типизированных языков.
> npe это самая частая причина вылетов в рантайме
Львиная доля которых - пропуск проверки err. Как и в других компилируемых языках, не хочешь npe - не используй nullable-тип или пиши тесты/фазз-тесты.
Можно конечно сначала получить все строки, и потом уже взять нужный диапазон, но это как-то неэффективно.
То есть после ListenAndServe() менять хэндлеры без остановки и перезапуска?
Если да, то как реализовать?
всё очень прозаично
s := http.Server{
Handler: http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
if time.Now().Unix()%2 == 0 {
mux1.ServeHTTP(rw, r)
} else {
mux2.ServeHTTP(rw, r)
}
}),
}
>Ничто ведь не мешает добавить в args значения для Limit
это какая бд разрешает лимит вместе с аргументами передавать?
Mysql
блин, ну чет хз. Тут mux"ы предопределены. Мне же нужно при наступлении определенного события сформировать новый хендлер их контекста события и подменить им старый.
Может как-то так попробовать
h := someHandler
server{Handler : h}
go func() { server.ListenAndServe() }
h = anotherHandler
Попробую при случае, или хуйню написал?
поинтер подменяй или в мапу засунь или слайс, есть же динамические структуры данных. то что я написал легко можно представить в виде
s := http.Server{Handler: http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
________realHandler := getHandler()
________realHandler(rw, w)
____})
}
>>367602
когда ты записал h в хендлер её значение скопировалось в структ сервера и что ты там потом пишешь в h ему вообще похуй. во-вторых это датарейс.
Пик 1 делаю POST запихиваю свой json получаю ответ.
Пик 2 мои туги сделать тоже самое на Go
Только от postman я получаю нормальный ответ 200
А в Go я иду нахуй
Да, вот это нормальная тема. Спасибо!
time.Now(). Format("2006-01-02")
Да спасибо помогло
Весь интернет перерыл везде только создание по шагам типо addTitle addString addPic, а такого чтоб xml с тегами втолкнул и заработало нигде не нашёл. Если просто текст затолкать он все теги как текст и вывидет, что и логично
Может я искать не умею или тупой и чего-то не понимаю. Помогите
Проиграл
Интересно. Типо сам ручками? Окей попробую
Горутины дешёвые, их можно создавать тысячами, а тредов не должно быть больше, чем ядер + нужно уметь распределять задачи по пулу тредов.
>а тредов не должно быть больше, чем ядер
Шо?)
Хочешь в Питоне создам 100 тредов вообще изи? Или в Пхп fpm заспавнит 100 тредов на 100 коннектов
Да хоть тысячу создавай, я же не говорю, что технология запрещает так делать. Но смысла нет.
>преимущество
рантайм Го сам их приостанавливает и запускает по необходимости. + удобная фича в виде каналов.
Почитай про шедулер Гошки, довольно интересно кмк.
Ничего го не перезаписывает. Если есть запас capacity у слайса, добавляет. Если нет, выделяет память и пишет новые значения туда. Можно сразу брать капасити с запасом
Есть json, мне нужно его распарсить чтобы получить два элемента. Как можно это грамотно реализовать?
Достаточно ли просто структуру с двумя элементами создать? Или нужно поебаться?
нужно поебаться и навести мышку на замечания линтера и прочитать что
а) в неэкспортируемые переменные ничего не заанмаршалится
б) теги для полей пишутся не так
Твое замечание подправил, но получаю следующую ошибку:
json: cannot unmarshal array into Go value of type controller.Hueta
А, увидел догонку ниже. Тоже на этой хуйне свалился
Ну чел, у тебя в json'е массив лежит, а ты хочешь вытащить какую-то пару значений. Тебе массив вытаскивать надо, примерно таким же образом делается, просто стракт еще один сделай, где поле типа []Hueta будет.
Кста, не ебу, является ли твой массив в json'е является верхнеуровневым или болтается как поле в виде "hueta": [...], во втором случае надо будет делать var huetaSlice []Hueta и анмашларить в него
Короче вот что сделал
>мне НУЖНО писать на языке Х как будто я пишу на языке Y
Ну да, а хули нет? Я не обязан подстраиваться как чмоня под любого хипстера, флюродросящего "новыми" концепциями, пусть под меня подстраиваются
Два чаю. Сейчас готовлюсь к собесу на сеньку, после успеха смогу каждую неделю ебать новую атласную шлюху и даже не задумываться о тратах
Канал != очередь, у него другое назначение. Можно сделать его буферизированным и тогда сколько-то можно будет накидать не читая, но потом все равно залочится.
ну тогда ответ: зависит от компании. если там все такие залетные с синдромом утенка из других языков или готовые жить с "Я не обязан подстраиваться как чмоня под любого хипстера, флюродросящего "новыми" концепциями, пусть под меня подстраиваются" , то норм. если нет, то на ревью киберунизят.
для неблокирующей отправки без гарантии отправки есть синтаксис через select. если тебе бесконечный буфер нужен, то пиши свой канал, один хуй это обертка над массивом по сути.
Какие еще варианты?
Как вариант пару задачек на Stepik по программированию решить. Раньше за это давали студ. лицензию на 3 месяца. Как сейчас не знаю.
BTW чем лучше того же VSCode? У го же охуенный тулинг и language server, что еще может быть нужно?
Знавал я человека который на любом языке писал нечитаемую императивную дрисню. Чел был охуенно полезным, но его код без него заморозили и переписали с нуля.
Так вот, если твоя ценность только в том чтобы код писать, то гошка не для тебя. Она как и раст, пиздит гребца когда он пишет код не как принято, только пиздит в рантайме и от того больнее.
Ну не знаю, меня рантайм пиздит, только когда увлекся возвращением nil вместо ошибки (и забыл проверить на него) и при кривой конкурентности. Базово все работает предсказуемо, потому что язык примитивный по дизайну
VSCODE у меня в голове прочно связан с фронтендом и моими потугами в JS а меня от js блевать тянет и на изнанку выворачивает поэтому vs code мне опротивел
Годно
Прочитал A Tour of Go и многое выклядит совсем нелогичным и даже сложным.
Реквестирую материалы для перекатывальщиков из питона, где объясняют что и зачем.
На питоне уже 4 года пишу, считаю свой уровень выше среднего. Кроме него только жаес знаю.
На степике курс текстовый по Го годный. А так просто динамикопараша в мозги насирает сильно конеч
Первое что бросается в глаза после питона:
всё строго типизированно
листы/слайсы перемудрённые
концепт поинтеров
классов нет, надо делать методы к объектам struct
Сорри, с нелогичным погорячился. Я понимаю что эти "сложности" связаны с тем что программе надо скомпилироваться и с памятью работать поумнее интерпритатора.
Просто мне пока сложно представить как, например, поинтеры использовать. А написание классов совсем кривым кажется по сравнению с питоном.
>всё строго типизированно
И это прекрасно. Явно приводишь к нужному типу, если это нужно. После Питона непривычно, но со временем понимаешь всю прелесть
>листы/слайсы перемудрённые
Про статические массивы можешь забыть. Практически не используются. К слайсам привыкаешь достаточно быстро, там все элементарно
>концепт поинтеров
Тут тоже все относительно просто. Нужно изменить конкретный объект - передаешь в функцию по ссылке (поинтер). Нужно просто передать значение - передаешь копию примитива (обычная переменная). Ну и слайсы с мапами передаются по ссылке by design.
>классов нет
А есть принципиальная разница? Какую суперфичу приобретает структура, если назвать ее классом? По факту отличается лишь специфическим наследованием через "встраивание".
степик это stepik
Спасибо что разъяснил, попробую пересилить себя.
>А есть принципиальная разница? Какую суперфичу приобретает структура, если назвать ее классом? По факту отличается лишь специфическим наследованием через "встраивание".
Наследование у классов очень удобное, а ещё питоновские классы можно учить превращаться в dict/list и прочие структуры с помощью дескрипторов.
>>371980
>А смысл перекатываться, проблемы с работой тоже?
Я девопс, мне что-то кроме питона не сильно нужно. Хочу вкатиться для собственного развития, у меня тонна проектов написанных на питоне. Было бы очень круто их переписать на что нибудь компилируемое и быстрое. Да и девопсить надоесть может, перекачусь в девелопера.
>Наследование у классов
Хорошее наследование это когда его немного. Встраивания и интерфейсов вполне достаточно.
>превращаться в dict/list
ну в статической типизации как бы и не принято, что бы что-то неявно превращалось. Пиши метод, проблем нет.
Как бы в этом и прикол, что кода приходится писать больше, но компилятор дает определенные гарантии корректной работы.
Дебажить Питон это больно. На Го я частенько пишу код часа 2, затем запускаю его и все работает сходу
Для меня долго дебажатся логические ошибки, а не синтактические. Такое не отловишь на уровне компилятора, тут тестировать надо.
Думаю в го тоже самое будет. Хорошо что у меня куплен пак IDEх от жетбрейнсов, уже запилил себе goland.
Лето же. Пора в отпуск петов делать
Недавно попустили на моем первом собесе на гоху. Задали вопрос:
- В чем преимущество сервера на горутинах перед сервером на обычных тредах? Например на php
Я ответил:
- Ну горутины более легковесные
- Это-то понятно. Но все же, в чем преимущество?
Блять, я даже и не знал что на такое ответить. Естественно правильный ответ они так и не назвали.
ну рассказал бы в чем преимущество ты че. легковесность это такое себе, ты же их не мешками на себе таскаешь. От тебя наверняка ждали рассказать про сисколы, контекст свищинг, размер стака у ос тредов и такое
Еще был такой вопрос: "мы запустили миллион горутин, в каждой из них мы слипаемся на 100 секунд, какие ресурсы и в каком объеме будут затрачены? усложнится ли сборка мусора? насколько?"
чего блядь
Мидл. У меня опыта полгода на Ноде и 2 года на Питоне. Но меня пиздец ебали сначала по кишочкам GC и мой ответ про "конкурентную сборку мусора и 3 цвета объектов" их не устроил, хотели глубже. Еще были всякие интересные вопросы про то что представляет собой структура горутины или подробное описание операции битового сдвига на АЛУ (!)
Кароч, меня 1.5 часа гоняли по внутренностям гохи, не получил ни одного вопроса по базам данных или вебу в целом.
да, аппенд создает новый слайс. в слайсе два инта и один поинтер https://go.dev/src/runtime/slice.go, поэтому это не страшно.
Ищу пересечение двух массивов. Нормально ли делать как тут - в запущенной горутине мутировать мапу? Или это не по философии го?
А тут есть что-то сложное? Или Питон настолько психику травмирует?
Ни для кого не секрет, что на Го чуть больше кода писать приходится. Но вместе с этим есть и куча преимуществ
В данном коде мапу никто не трогает извне, так что норм. Только смысла у анонимной функции возвращать мапу которую она заполняет нет.
это максимально классический паттерн с вейтгруппой.
Не буду пожалуй пока говорить, чтоб не деанониться на всякий.
Это одна из крупных рашн фирм, не ожидал что меня настолько попустям там, такое ощущение что они сеньку искали.
сэкономил тебе две строчки
Какая-то хуйня, я проходил собесы в кучу контор от Авито (6 ебучих собесов, рекорд!) и Яндекса до Тинькоффа и Гетта и нигде настолько глубоко не докапывались. Ну или ты привираешь.
Про сборку мусора не нужно знать про цвета объектов, надо знать в общих чертах как это работает, и как это отображается на коде, классический вопрос с runtime.Gosched и всё такое.
BTW посоны а где чего интересного можно почитать про types2 и прочие изменения внутри го из 1.18? Я что-то ленюсь прям по коду го разбираться, хочется почитать обзоры про мономорфизм и вот это всё. Generics the hard way я читал и изучения глубины вопроса не оценил.
В смысле? Мы заюзали append и он возвращает новый объект. То есть старый остался, мы его скопировали и засунули туда еще одно значение. Если arr в них обоих указывают на один и тот же массив, то блэт исходный должен был измениться, но это нихуя не так.
Не понимаю бля, в чем смысл возни с capacity если мы в любом случае целиком копируем слайс в случае append/
> Не понимаю бля, в чем смысл возни с capacity если мы в любом случае целиком копируем слайс в случае append/
Потому что он копируется не всегда, а только, если вместимость старого массива оказывается превышена.
1) У тебя был массив размером 4 и вместимостью 4: [a, b, c, d]
2) Ты добавил туда новый элемент "e"
3) Тебе под этот слайс был выделен новый массив с удвоенной вместимостью 8, а размер массива теперь 5: [a,b,c,d,e].
Это чтобы если ты скажем в цикле аппендишь массив, не перевыделять память каждый раз, она выделяется с запасом.
Реальный юзкейз:
func IntsToStrings(arg []int) []string {
ss := make([]string, 0, len(arg)) // размер 0, вместимость равна вместимости arg, то есть мы однократно выделили память под массив строк без перевыделения промежуточных массивов
for _, x := range arg {
ss = append(ss, fmt.Sprintf("%d", x)) // и просто добавляем значения аппендом
}
return ss
}
https://goplay.space/#gUSZ5oAphPc
>исходный должен был измениться, но это нихуя не так.
ты ожидаешь что у исходного длина поменяется? заресайзь его до капасити и увидишь, что если аппенд не привел к реаллокации, то после старой длины лежит новый элемент.
проверяется вообще максимально просто без еботы с капасити.
a := []int{1,2,3}
_ = append(a[:0], 4)
fmt.Println(a)
a := make([]int, 0, 4)
a = append(a, 1, 2, 3)
_ = append(a, 4)
fmt.Println(a[:])
fmt.Println(a[:cap(a)])
Так блять
Вот этого не понял (хули он не показывает последний элемент в первом случае? я ж блять заставляю его целиком слайс напечатать)
> меня опыта в программировании лет 8, но я не разу не работал программистом
Напизди что работал
Че ты как маленький
Ты мне скажи пож-ста. Можно ли приравнивать опыт работы скажем в год, к паре проектов на го, одним из которым мы с корешами пользуемся почти каждый день? Я могу примерно подтянуть себя по требованиям к мидлу. Есть еще леткод и кодварс, и вообще я задачки решать люблю. Но боюсь, что если напизжу то просто не потяну реальные задачи.
Очевидно что пиздеть лучше правдоподобно, не стоит сообщать о якобы 8 годах опыта работы, если по факту нет нихуя, лучше сказать что 2 года прогал на питоне/пхп/жс на беке и последние полгода на ГО, чистых гошников практически нет
Только в каждом выдуманном проекте ты должен заранее придумать чем лично ТЫ занимался и что это был за проект. Это всегда первые вопросы на собесе, если не можешь внятно описать что ты делал на прошлых местах,, это будет выглядеть очень подозрительно
В питоне я просто делал
api_username = os.getenv("API_USERNAME") or "username"
В каждой высокоуровневой функции своего пакета ставить recover чтобы не ловить ошибок в рантайме и возвращать ошибку из функции напрямую это норм идея?
два редиса
Плюсом к этом периодически при загрузке картинки в хайрезе/видео он выдает в ioutil.ReadAll и подобных unexpected EOF, лог такой на пик 3
А куда wg wait поставить? У меня стоит в самом конце проги, чтобы дождаться всех файлов.
И что значит "прокинуть j в горутину"? Типа как аргумент передать анонимной функции?
А еще лови ошибку от ioutil.ReadAll. А еще Body.Close до чтения из ридера. А еще его в defer. А еще чекни статус у response на 200.
> А куда wg wait поставить? У меня стоит в самом конце проги, чтобы дождаться всех файлов.
Хорошо.
> И что значит "прокинуть j в горутину"? Типа как аргумент передать анонимной функции?
Да. У тебя же не блочится цикл. Цикл бежит быстрее, чем выполняется горутянка. j инкрементируется и используется в горутине не с тем значением, с которым ты ожидаешь (гонка же. В твоем коде возьмется последний индекс, наверное).
> htmlFile += ...
Посмотри на html/template
А еще ты скорее всего хотел continue вместо break
>А еще лови ошибку от ioutil.ReadAll
Ловлю (пик 1)
>А еще чекни статус у response на 200.
Она обрабатывается в другом месте
>>377021
Это я понимаю, но не понимаю как реализовать, range же сам по себе инкрементируешь счетчик, а если я делаю цикл через j < len(Files), то он какого-то хуя больше чем нужно увеличивает счетчик и в итоге получается out of range.
Я пробовал через atomic.AddInt и sync.Mutex, всё равно, но мб я еблан и чето не то делал
>Посмотри на html/template
>А еще ты скорее всего хотел continue вместо break
Да, лол
Спасибо, анон
> >А еще лови ошибку от ioutil.ReadAll
> Ловлю (пик 1)
На пике 3 у тебя ошибка летит из http.Get.
В дальнейшем приучись ловить ошибки где только можно. Ненужные отбрасывай. Заиспользуй потом github.com/pkg/errors. Позволяет стектрейсы собирать.
> Это я понимаю, но не понимаю как реализовать, range же сам по себе инкрементируешь счетчик, а если я делаю цикл через j < len(Files), то он какого-то хуя больше чем нужно увеличивает счетчик и в итоге получается out of range.
У тебя мб files чистится до исполнения горутины. Передавай тогда в аргументы сразу строки, которые используешь.
> Я пробовал через atomic.AddInt и sync.Mutex, всё равно, но мб я еблан и чето не то делал
https://goplay.space/#qCG2BrQ0F0F
https://goplay.space/#ZMfaA0X-Erq
>У тебя мб files чистится до исполнения горутины.
Я об этом чето даже не думал, посмотрю, анон
>Да. У тебя же не блочится цикл. Цикл бежит быстрее, чем выполняется горутянка. j инкрементируется и используется в горутине не с тем значением, с которым ты ожидаешь (гонка же. В твоем коде возьмется последний индекс, наверное).
там j := j
дефер для отлова паник ставят редко, чтобы не загаживать код. все равно все хуй отловишь, поэтому обычно там в мейне и в какой-нибудь мидлваре хттп роутера. в других местах обычно добавляют после того как уже упали, а баг не нашли и вот решили закостылить.
Попка не слипнется?
это не скрытая логика, а распространенный паттерн в замену более вербозного создания горутины с аргументами. стейтмент находится в том же скопе, что горутина, а не хз где. я намного реже вижу горутины-лямды с аргументами и каждый раз обращаю внимание на них.
Какой-нибудь тырнет-магазин
Вспоминаем 5 класс.
5-10 минут - это 7.5 минут, т.е 450 секунд => 1 видео в секунду.
Скорость загрузки 8-10 мб/с - это 9 мб/с => 1 видео весит 9 мб.
Суммарный размер = 9 * 450 = 4050 мб
Идиот блять. С заказчиком, когда он тебе даст невнятное ТЗ тоже маняподсчеты вести будешь?
Там вся работа и проходил, сплошная угадайка. Заказчик пишет хуйню, ты ему в ответ манярасчёты, он тебе в ответ пишет, в чём ты не прав, и так до финального "согласовано, делайте".
>выводим причину из следствия
чел... тебя перепроверить попросили, а не вычислить то, что тривиально выводится из перечисленных данных. для проверки все равно нужно сравнить полученные тобой 4050МБ с исходным суммарным размером. это в каком-то классе учат или с образованием всё так плохо?
Каков вопрос - таков и ответ. Постановка задачи такова, что из следствия надо вывести только одну причину, и она будет единственной верной.
Ничего, как и по ФП.
Некоторые шизы настаивают, что ООП есть, но на самом деле это всё равно что сишка со структурами и функциями.
Как это использовать в методах хендлера/юзкейса/репозитория? Создавать для каждой структуры геттеры полей? А если структура с дохуищей полей?
У тебя что, так много структур, где дохуища полей? Так генерируй.
Это правда что Жава пукает тредом на каждый новый реквест? А Гоха пукает горутиной? В чем плюс гохи тогда?
> Это правда что Жава пукает тредом на каждый новый реквест?
Нет, жаба берёт свободный тред из заранее созданного пула тредов, он и обрабатывает запрос. Если свободных тредов нет, ждёт, пока появится, но ждать надо мало.
> А Гоха пукает горутиной?
Да.
> В чем плюс гохи тогда?
Можно срать не снимая свитер.
>берёт свободный тред из заранее созданного пула тредов
Но нахера? Создание треда - довольно дешевая операция. Почему бы не создавать их динамически?
Нет, создавать нативные треды очень дорого, в отличие от горутин, к тому же нативные треды жрут много памяти.
"Некоторые машины" - это большинство, причём минимум 1МБ.
Ла, по сравнению с горутинами, которые можно спавнить тысячами, это охуеть как много.
ты там собрался все дто в интерфейсы запихнуть? интерфейсы про поведение, а не про данные, каковыми являются дто.
Пришел к вам за советом, вкратце опишу ситуацию.
Работаю уже как год и несколько месяцев на позиции инженером по нагрузочному тестированию, по многим причинам уже успел заебаться в следствии чего в начале апреля решил вкатиться в разработку выбрав язык go.
Прошу направить в нужную сторону и/или дать советов, насколько это реально, какие подводные есть. Правильно ли что делаю акцент на проектах в гитхабе или многим похую.
Сообщение может показаться сумбурным, но могу побольше рассказать о своем опыте и знаниях.
>по которому Го не ООП
Нет наследования (встраивание и композиция - не наследование)
Полноценно не соблюдается SOLID
Пробуй. Но не возникай потом, если тебя не будут даже на собесы звать т.к. "опыта мало". В го не вкатываются с нуля.
>по многим причинам уже успел заебаться
пили сториз
>Прошу направить в нужную сторону и/или дать советов, насколько это реально, какие подводные есть. Правильно ли что делаю акцент на проектах в гитхабе или многим похую.
хз. у тебя шансов больше чем у хуя который вкатывается с нуля. на гитхаб будет на 100% похуй, если ты будешь валиться на самом собесе. а для нормальной зепки скорее нужен опыт+удачный собес+предложение от соперника, а не гитхаб с нерабочими интернет-магазинами.
>пили сториз
Моя позиция особо востребована в банках из чего вытекает следующее
Самая большая проблема это крайне сильная бюрократия с цепями и миской риса. Вот пример, чтобы отладить скрипты мне приходиться подключаться к виртуальному пк через рдп а уже с него к другому пк. Обязанности распределены по ебанутому. Я как-то девопса просил скинуть конфиги постгреса и я ждал сука 3 ДНЯ БЛЯТЬ, хотя это делается в ОДНУ команду. Когда подключаешься через впн к внутренней сети банка тебе обрубают выход в интернет из-за чего приходиться писать бат костыли чтобы вернуть выход -_-
И конечно же перекидывание ответственности с одной команды на другую, я заебался за сегодня искать команду которая могла бы написать ебучие экспортеры на опеншифт и постгрес
> Нет, жаба берёт свободный тред из заранее созданного пула тредов, он и обрабатывает запрос. Если свободных тредов нет, ждёт, пока появится, но ждать надо мало.
Так жаба говно получается? Значит её бессмысленно вертикально масштабировать. Надо горизонтально?
Да. Только если стек не реактивный
Ты же пацан еще, тебе рановато в го, Мужику не нужен "солидный" гитхаб, Мужик сам по себе имеет ценность
ООП это не про наследование, совершенно необязательная его часть, которую нормальные люди как раз делают через композицию. Наследование это антипаттерн.
Солид это вообще маняфантазии из разряда "за все хорошее против всего плохого".
Или ладно пох, в каком месте не соблюдается солид? Кем? А почему должен?
> совершенно необязательная его часть
Для всё не обязательная часть, определим ООП как "возможность создавать структуры и передавать их в процедуры", и ООП будет хоть в ассемблере. Нет, нихуя так не работает, ООП либо есть, и оно как в крестах и жабах, либо его нет, и точка.
ООП ради ООП? И именно такого как в Джаве/Плюсах? Или лучше все таки взять лучшие практики, а говно типа множественного наследования выкинуть нахер?
Если нужно как в Джаве - пиши на Джаве. Но это не значит, что раз не как в Джаве, то уже не ООП
А если серьезно, база ООП - это полиморфизм. И его вполне достаточно для соблюдения твоего любимого СОЛИДа.
Инкапсуляция? Питон клал на инкапсуляцию и что теперь? Не ОО?
Какую уникальную возможность дает наследование так и не понятно. И чем хуже композиция? Вопрос не раскрыт
Да почему не ООП то? Третий раз интересуюсь.
В чистой архитектуре нормально раскладывается, что является ядром ООП, а что второстепенно. Вполне конструктивно
Напиши свой шедулер для кубера.
Некорректно объянил, но в общем понятие ООП не имеет значения, слишком абстрактное понятие, языки могут не являться ООП, но на них можно писать в ООП стиле. Хуету придумали, а долбоебы зафорсили.
Как думаете, Го хороший язык для вката?
Говорят, он довольно просто и что важно для меня - быстр (какие-то тесты показали что скорость уровня C++)
Но я понять не могу, что на нем можно сделать? Все-таки хотелось бы вкатываться с портфолио каким-нибудь
Хороший язык для вката это c#. Go узкоспециализированный, компактный, учится за неделю, но он для тех, кто знает, что ему нужно.
В го нет джунов.
>учится за неделю
Я так уже "выучил" его за неделю, что был попущен на первом же собесе. Это несмотря на то что у меня опыта почти 3 года на беке
>какие-то тесты показали что скорость уровня C++
Какие? Какие-то.
>что на нем можно сделать?
Микропенис, а потом еще один, а потом еще один, ..., а потом еще один, а потом тулзу для управления этими микропенисами.
Не С++, а С
Какие? Щас не могу найти ссылку на гит. Но там матем. вычисление лямбда-хуямбда что-то в этом роде.
пока я твердо уверен, что у вас это не так работает, как мне описали
Ой, в Го
>матем. вычисление
Они задрочены уже настолько, что все компилируемые языки примерно на одном уровне.
Нет.
Ну если сравнивать с плюсами то да, система сборки это просто майндконтролл какой-то. Компилировать просто, зависимостями управлять просто, есть флаги компиляции под разные архитектуры. В плюсах этого нет, скорее всего потому что ему уже 40 лет, и деды-ебланы очень неохотно внедряют современные всеми привычные вещи в язык.
Для дронов вряд ли. Там все таки реалтайм нужен.
Для IoT - бля, мои мысли изложил. Только пидрилы из Tiny Go который год не могут запилить поддержку Wifi для ESP32. Если дождемся - заживем.
чтоб получить бинарь:
>go build
запускаешь
надо чтоб сорцы лежали в определенной иерархии, тогда все компилится, по началу непривычно может быть, но быстро втягиваешься
продолжение
И еще кстати не понимаю, почему МашОб"ом то так все плохо. Избавляемся от Питоновской лапши и скорости, сохраняя простату. Не ловим UB с плюсами. Не жизнь, а сказка.
Что имеем: кучу каких-то наколеночных решений для 1.5 задач и Горгонию для пацанов, закончивших MIT. Где мой Fit/Predict блять?
Вообще с библиотеками беда. 90% - 5-10К звезд, при этом разрабатывались три года назад какими-то ноунеймами.
Обидно, что такой замечательный язык так обделяют. Я бы вообще все на Го переписал.
>Избавляемся от Питоновской лапши
Орнул как представил, что заместо простого и понятного вызова вроде np.cross прогер хуярит простыню самописной хуеты
Нет, ну сяду я, напишу хуету какую-то (не напишу, я не умею). И будет не 10 васянских мл библиотек, а 11. Тут нужен пуш фаанга
Вот станешь 300к нсек, будешь бухтеть и раздавать пиздюли. А пока надо грести и не задавать вопросов.
Вот тут пишут что в /cmd/app пихать мейн апп
https://github.com/spf13/cobra/blob/master/user_guide.md
Вот тут пишут что мейн апп кидать в корень, а в /cmd кидать командочки.
Кому верить? Как делать?
Хочу чтобы как у людей было
Забить хуй. И делать как считаешь целесообразным. Посмотри топовые проекты, там везде по разному.
То что какой-то хуй с горы написал что это golang standarts ничего не значи. А он реально хуй с горы, которому лишь бы директорий наплодить
Вот например, в корне три директории. build, scripts, tools - нахуя три директории, которые решают одну и ту же задачу. При этом Makefile у этого уникума лежит в корневом каталоге.
Директория vendor добро пожаловать в 2007.
web, website.
Ну реально, если переменная типа интерфейс это пара из поинтера на данные и поинтера на первый элемент списка (или массива - я не ебу) методов, схуяли мы в рантайме не можем осознать, что это таки не сам интерфейс и перед проверкой типа сначала получить реальное значение?
Мб это как-то связано с оптимизацией пустого интерфейса?
>И делать как считаешь целесообразным
Опыт не позволяет понять целесообразность
Но окей, сделаю как получится, спасибо
а кто сказал что есть суть? кидай код. я вижу только возможность присвоить интерфейсу другое значение, полностью аналогичную интам и другой поинтер на хуйню хуйне. в живом коде от людей с экспириенсом не вижу подобной хуйни.
>>385393
вообще похуй. у нас все мейны в cmd идут и я тоже так делал как вкатился. мейн в руте на второй работке видел, в принципе тоже норм. всякие тулзы там кроме главного бинарника в cmd кидал и вроде всем норм было.
а вот всё остальное что можно придумать я бы сказал не норм.
плюс ты ссылку ебаной кобры привел. это бля в принципе довольно специфичная хуйня для консольных утилит, которые построены именно на кобре. у сервисов в продакшене обычно нихуя "команд" нет и кобра нахуй не нужна. я бы даже сказал, что нормальным людям достаточно flag, потому что вы просто ебанутые если накидываете дохуя логики в флаги, заведите конфиг бля или сделайте по-нормальном.
Обязательно ли ставить лок на мапу (или юзать sync.Map) если мы знаем что запись новых значений в нее будет идти лишь 1 раз по каждому ключу?
(спросили вчера на собесе, правильный ответ так и не сообщили)
Ты же понимаешь, что приличная доля питоновских машоб-вызовов требовательных к cpu это на самом деле cpp с питоновской обвязкой? или не понимаешь?
Понимаю, но тогда зачем очень часто продакшен модели переписывают под плюсы. Значит влияет
Хз, попробуй взять обычную и параллельно из нее почитать. Думаю что работать будет, но -race будет ругаться.
Ну и мантра про то, что надо думать на будущее и в последствии кто-то захочет писать в нее еще.
Вообще хз, может кто поопытней ответит.
Если race ругается, значит там есть проблема.
По поводу изначального вопроса, короткий ответ: нет, так как запись в мапу не атомарна и там под капотом может происходить много вещей от просто записи в бакет до перевыделения памяти под всю мапу.
>>383197
Я неиронично думаю, что один из основных ништяков питона это его динамическая структура, это во-первых позволяет на лету эвалить какие-то участки кода, чуть ли не выделяя их мышкой, пробовать всякое не дожидаясь компиляции и так далее. Во вторых, питон динамический, что позволяет не думать о типах и писать говнокод, ту самую лапшу, которая конечно говно, но что ты ожидаешь от MLщиков? Они никогда не были про хороший код. Соответственно, чем меньше они думают о коде, тем лучше, говнокод писать быстрее и им не нужно ничего учить лишний раз.
Я бы уж тогда предложил им JS, который хоть и говно, так хотя бы быстрое, под капотом у V8 пиздец сколько оптимизаций.
Но при этом есть класс спецов, работа которых заключается в переписывании питоновской лапши под С++ с оптимизациями под ГПУ и процессор, получающих на уровне ДС"ов, а то и больше.
Если для крупных компаний это приемлемо, то для небольших компаний/стартапов было бы выгоднее взять специалиста, который сможет запилить несложные модельки на Го, при этом не наговнокодить и сразу запустить в прод.
С другой стороны вроде как Горгония может в ONNX, так что ситуация становится проще, но тем не менее, так и остается маргинальщиной.
Хотя настоящая причина моего негодования в том, что я хочу поиграться в МЛ, но от Питона начинает тошнить
>на лету эвалить какие-то участки кода
Не думаю, что ДСы таким занимаются. По крайней мере ни разу не видел.
>позволяет не думать о типах
Опять же, разве в ДС нужно что-то кроме матриц флоатов и комплексных чисел?
То есть плюсы питона для ДС не очевидны
Как это почище реализовать?
была мысль с RWMutex и булевым значением типа такого:
func (s struct) () {
s.mu.RLock()
isrunning = s.isRunning // bool
s.mu.RUnlock
if isrunning {
____return "already running"
}
s.mu.Lock()
s.isRunning = true
s.mu.Unlock()
выполняем нужные действия*
s.mu.Lock()
s.isRunning = false
s.mu.Unlock()
return "finished"
}
Но это прям каким-то говном кажестся. Прям реально извиняюсь, что вам пришлось это увидеть, но как сделать по-другому пока не представляю.
Как это почище реализовать?
была мысль с RWMutex и булевым значением типа такого:
func (s struct) () {
s.mu.RLock()
isrunning = s.isRunning // bool
s.mu.RUnlock
if isrunning {
____return "already running"
}
s.mu.Lock()
s.isRunning = true
s.mu.Unlock()
выполняем нужные действия*
s.mu.Lock()
s.isRunning = false
s.mu.Unlock()
return "finished"
}
Но это прям каким-то говном кажестся. Прям реально извиняюсь, что вам пришлось это увидеть, но как сделать по-другому пока не представляю.
Ну если это основная структура пакета, что в начале. Вспомогательные в месте использования.
В отдельных файлах как-то не приходится. Если это не DTOшка какая-нибудь
ага. файлик structures.go
там рядом файлик interfaces.go
еще рядом functions.go
еще рядом methods.go
еще рядом constants.go
еще рядом variables.go
Ну и че ты выебуешься, я types видел в нескольких проектах. Щас заебашу клин кода, сделаю как у тебя и потом будешь так же писать
Я откуда знаю? Возможно чтобы код не за засорять несколькими структурами для парсинга json
А что не так? Нужно постоянно смотреть как делают другие и это анализировать, иначе развитие будет идти медленнее
Ну вот на авторитетном оранжевом форуме спросил, это добавило понимания, что не так?
>Жава пукает тредом на каждый новый реквест
Если брать обычный спринг с обычным Tomcat сервером, то в целом да, там был тредпул, и оттуда брался свободный тред.
Еще есть webflux на netty, там все асинхронное, никакого жесткого долблебния в тредпулы нет.
Сейчас осенью выйдет JDK19, где уже будет Loom. С осени на жабе можно будет пукать виртуальными потоками точно так же, как это сейчас в го делают.
Есть же стажировки в яндексе, озоне и вайлдберисе. Наверное еще и в авито есть.
Озон и вб сейчас должны расширяться, так как параллельный импорт набирает обороты + ушли с рынка всякие торговцы шмотками и мебелью и еще кучи всякого другого
В го вкатуны не нужны толком. Если не осилил войти в какой-нибудь помойный вайлдбериз стажером, то лучше забей и ищи работу где-нибудь в других стеках, в той же пыхе мб что-нибудь и найдешь (гошка плюсом будет возможно).
Вообще сейчас на гошу переходить особо никто не будет, так как это деньги и время, а сейчас времена очень жидкие и неспокойные. Вкладывать хуй пойми сколько миллионов в переписывание легаси параши с пхп на го желающих сильно поубавилось.
>улучшить навыки параллельного программирования
Классных видео или упражнений, чтобы легко, просто и без задней мысли прокачать concurrency попросту нет.
Смотри эти лекции
https://www.youtube.com/playlist?list=PL4_hYwCyhAva37lNnoMuBcKRELso5nvBm
https://www.youtube.com/playlist?list=PL4_hYwCyhAvYTxm55RBm_HA5Bq5W1Nv-R
Делай домашки отсюда
https://gitlab.com/Lipovsky/concurrency-course
Читай талмуды пикрил, а также всевозможные статьи по теме моделей памяти, атомиков + всякие прикольные штуки по типу Software transactional memory, structured concurrency, и т. д., для этого возможно придется погрузиться в разнообразные пропозалы или даже научные статьи на arxiv.org.
В общем, если все это осилишь, то наверное что-нибудь и поймешь в многопоточке и конкарренси, я тебе гарантирую.
Я в глухой деревне и не могу пока твоим советом воспользоваться, расскажешь каково это изучать параллельное программирование?))
То, что нужно, спасибо!
Насколько я понял, реализовать мой случай можно таким образом:
1) Добавляем в структуру поле *sync.Once
2) При вызове функции
----выполняем функцию через once.Do(Fn), параллельные вызовы блокируются
----В конце успешного вызова функции делаем once := new(sync.Once), чтобы по окончании можно было вызвать ее снова в будущем.
И ты таким образом переносишь гонку в `once := new(sync.Once)`. Мьютексы это норм решение и тебе нужно просто +- изящно структурировать код. Советую тебе сначала проверять isRunning атомиком, а потом просто открывать мьютекс и фигачить. Примерно так:
https://goplay.space/#txO7srv9M2F
Бля, забыл isRunning выставлять. Вот примерно так должно работать: https://goplay.space/#vRcOzdMKUXV
>once := new(sync.Once)
ага, теперь незобудь once мутексом оградить.
если тебе нужно снова вызывать её после завершения, то ты по всей видимости mutex.TryLock из 1.18 хочешь. но если ты его хочешь, то ты что-то неправильно делаешь.
А зачем так сложно? Всю функцию можно упростить, используя только atomic.CompareAndSwapInt32
Потому что я на го программировать начал тогда, когда CompareAndSwapInt32 ещё не было, забыл про неё. По идее да, должно сработать.
Кстати да, мы же в других горутинах обращаемся к once в этот момент. Не учел, спасибо! Видимо действительно придется вникать в atomic
func (s *PServer) Update() error {
____if !atomic.CompareAndSwapUint32(&s.updatingNow, 0, 1) {
________// updatingNow != 0: Update() already called at the moment
________// so no need to call it again until the first call completes: this call will be ignored
________return nil
____}
____// Else: updatingNow == 0: There are no other goroutines that execute Update function now.
____// After Update function's end PServer.updatingNow is set 0 (false),
____// so the next Update() call will be executed
____defer atomic.StoreUint32(&s.updatingNow, 0)
...собственно выполнение самой функции...
____return nil
}
На хабре была годная статья по вопросам на Го собес. Поищи.
Ну и также на Хабре по устройству сборщика, горутин.
Как раз по ней готовился (если мы об одной) в двух частях. Спасибо
Зачем его перекапывать? Нормальные программы и без этого пишутся, чего нельзя сказать про Go.
Нормальные это хелловорды на WPF с приминением паттернов, ведь сразу нормально сделать было нельзя, и вообще любим это легаси говно тащить за собой в .NET Core.
Кстати, что с неймингом?
Не забудь про ключевые слова readonly, fixed, ref и разные контексты их использования. С другой стороны LINQ.
Microsoft превратила свой язык в какие-то питоно-кресты: с одной стороны куча нюансов, ансейф код - с другой ванлайнеры с линком и его охуенной производительностью.
Подскажите пожалуйста, вот я шлю запрос в БД и у меня в таблице есть столбец с NOT UNIQUE.
И когда я специально шлю запрос с дублирующим полем, программа выкидывает ошибку и и выход из выполнения.
Вот какой способ можете порекомендовать чтобы программа из выполнения не выходила, пробовал ошибку обработать но что-то не получается.
P.S. Да, я понимаю что вопрос может показаться пиздец таки тупым но хотел с пообщаться с опытными гоферами.
А что за ошибка то? Паника или ты сам принтишь ошибку, которую возвращает функция?
BTW
Если поле NOT UNIQUE - это значит, что повторяющиеся значения могут быть. Имелось ввиду просто UNIQUE?
>Если поле NOT UNIQUE - это значит, что повторяющиеся значения могут быть. Имелось ввиду просто UNIQUE?
Да, опечатался, имел ввиду что есть столбцы с UNIQUE ограничением.
>А что за ошибка то? Паника или ты сам принтишь ошибку, которую возвращает функция?
Для логирования использую библиотеку логрус
Вот ошибка с консоли:
{"level":"fatal","msg":"pq: duplicate key value violates unique constraint \"book_book_title_key\"","time":"2022-06-28T16:26:01+06:00"}
exit status 1
И я походу понял в чем проблема, короче решил я поменять логрус на стандартную библиотеку лог.
1. Шлю запрос с дублирующими данными
2. В консоли получаю ошибку и программа дальше выполняется
3. А логрус выкидывает exit status 1 и выходит из выполнения
Если я перепишу на стандартную библиотеку log, мне кажется что это будет считаться костылем и не решенной проблемой, как думаешь?
С логрусом не работал, но судя по всему, он считает такую ошибку критичной и крашит программу. Возможно, это поведение можно изменить в либе
Ну либо ты сам логируешь не через Принт (или его аналог в логрусе), а через Fatal
Вот только хотел отписаться, попробовал вместо logrus.Fatal logrus.Println и он с выполнения не выкидывает
Потому что стрейт форвард? Тупой и работает (в хорошем смысле)?
>>391242
Так точно не нужно делать. Херачь все в стдоут, девопсы разберутся. Ну или ты сам путем $ ./programm > log.txt
Если очень хочется все таки в коде файл открывать, вызываешь log.SetOutput(w io.Writer), куда передаешь открытый файл и не трогаешь его пока программа не завершит работу.
я его сам написал
Например у меня есть 20 картинок, которые можно сравнивать по размеру и объему. Уникальная картинка добавляется в сет и дубликаты просто на неё ссылаются.
И есть ли в go кастомные сеты из структур, чтобы не писать одинаковые для каждой структуры?
Понятно, что можно их отсортировать по весу и потом сделать какой-то более быстрый поиск, это все опустим
Дженерики.
1) Стандартный логгер это говнище, которое не умеет примерно нихуя и кстати это один из стандартных вопросов на собесах, недостатки стандартного логгера;
2) Вообще говоря, os.Exit вообще мерзкая функция, особенно если вызывать её не в main, поэтому вызов её в внутри внешней библиотеки это моветон;
3) Но тут авторы логрус не виноваты, потому что стандартный гошный логгер ведет себя так же, тоже сразу завершает всё при фатале. Смирись и просто запомни, что с легкой руки пидорасов, которые писали стандартный логгер (вот только хуже сделали, ей богу), в гошном мире теперь принято так;
4) Но при этом вообще говоря фатал никто не использует иначе, как выругаться об ошибке и сразу всё завершить, в продакшен коде ты скорее всего log.Fatal не увидишь;
5) Сам по себе os.exit кстати та ещё срань, потому что не вызывает уже зарегистрированные defer'ы.
Хм, понял тебя. Спасибо за такой развернутый ответ!
1) Тестированию
2) Логированию
3) Взаимодействию с БД
Собственно в чем проблема. Большая часть популярных проектов - библиотеки либо тулинг, соответственно смотришь только на куцые юнит тесты функций. О логировании и БД речи вообще не идет. Либо какие-то project-example, где тривиальная логика, а взаимодействие с БД ограничевается CRUD методами на одну таблицу.
Есть что-нибудь с +- продвинутой бизнес логикой, работой с БД, и прочими ништяками, при этом сделанных по уму.
В книгах тоже, к сожалению, вижу только бесконечные примеры в package main, которые к реальному проекту имеют весьма посредственное отношение и показывают только то как дергать нужные функции, при этом не понятно, как встраивать это в архитектуру приложения.
Ну то есть что-то типа real-world application посложнее простого CRUD
К сожалению таких нет, тем более что многие гошники вообще про организацию когда никогда не слышали.
я всё хочу написать какой-нибудь пример сам, но руки не доходят. Рекомендую почитать про ddd, гексагональную и слоистую архитектуру, что-то для себя поймешь.
У меня структура обычно выглядит так
/cmd - тут консольные команды типа run, migrate и так далее
/internal/domain/entity - структуры сущностей и интерфейсы репозиториев
/internal/domain/service - сервисы из предметной области
/internal/app/scenario - сценарии ака юзкейзы ака операции, скажем "регистрация юзера"
/internal/app/service - специфичные сервисы именно для слоя приложения
/internal/infra/postgres - реализации репозиториев, в гексагональной архитектуре это секондари адаптеры
/internal/infra/grpc - реализации сервера, в гексагональной архитектуре это примари адаптеры
Получается так, что /cmd поднимает приложение, внутри него поднимается реализация сервера /internal/infra/grpc
Этот grpc сервер внутри себя при получении внешнего запроса вызывает конкретный сценарий из слоя сценариев приложения.
Сам сценарий внутри себя оперирует сущностями, интерфейсами репозиториев и сервисами из доменной области, которая domain.
Реализации репозиториев лежат к примеру в /internal/infra/postgres
В итоге получается такая цепочка
Клиент вызывает grpc register_user -> grpc register_user вызывает сценарий "регистрация юзера" -> сценарий берет репозиторий Users и вызывает метод Create -> ответ возвращается в обратной последовательности.
Но у меня серьезное приложение, большой домен, много адаптеров, grpc, http, кафка, несколько бд, кеши и так далее, так что мы серьезно вложились в структурирование кода.
>/internal/domain/entity
>/internal/domain/service
>/internal/app/scenario
>/internal/app/service
"как сделать много папочек и не сказать путем ровно ничего для чайников"
сорсы твича скачай если хочешь увидеть рил ворлд хуиту
Спасибо за ответ. Достаточно полезно с точки зрения архитектуры приложения, хотя мне бы посмотреть уровнем ниже, как это все организуется в коде.
Как писать модульные/интеграционные тесты и тест-кейсы. Как именовать функции интерфейсов репозиториев и подобное.
Я бы с радостью заопенсорсил свой код, но у меня крупная закрытая контора финтех и такого конечно никогда не будет.
Давай попробую просто поотвечать на твои вопросы, немного псевдокодом.
> Как писать модульные/интеграционные тесты и тест-кейсы
Самое главное, разбить код на сценарии, чтобы понимать, что ты тестируешь. Далее берешь testify, и заводишь по сьюиту на сценарий, примерно так выходит:
type SuiteRegisterUser struct {
users entity.Users
client http.Client
}
func (s SuiteRegisterUser) BeforeTest(_, _ string) {
// делаешь инжекты в s, создаешь репозитории, поднимаешь сервер или мок-сервер если надо и всё такое
s.client = http.NewClient()
s.users = postgres.NewUsersRepo()
}
И соответственно начинаешь описывать различные кейсы конкретного сценария:
func (s SuiteRegisterUser) TestAlreadyExists() {
// подготовка данных, если необходимо
const email = "
ctx := context.Background()
s.Require.NoError(s.users.Create(ctx, &entity.User{Email: email}))
// производишь сценарий
_, err := s.client.Post("/register_user", map[string]interface{}{"email":emaiil})
// проверяешь результаты сценария, если вдруг нужно
s.Require().Error(err, "err_already_exists")
// в другом примере можно было бы найти юзера, чтобы убедиться, что он создался
}
Это пример полнофункционального юнит теста, при котором ожидается, что он поднимет сервер, законнектится к базе и проверит весь код в максимально боевых условиях. Конечно разные люди делают по разному, есть подходы, когда мокают базу, сервер и тд и тп.
Тут у тебя может возникнуть очевидный вопрос, как поднимать базу, если поднимать, я пробовал testcontainers и мне не понравилось, в итоге остановился на том, что в докере поднимаю прям постгрес (или локально или в пайплайне) и через переменные окружения прокидываю доступы в сам тест: TEST_DB_NAME=blabla go test ./...
> Как именовать функции интерфейсов репозиториев и подобное.
Интерфейсы репозиториев лежат в доменном слое, потому что это по сути набор операций над бизнес сущностями. Тут есть тонкости, модель может быть анемичной или rich, тебе придется прочитать про это отдельно, потому что люди делают по разному в зависимости от потребностей.
package entity
type User struct {
ID string
Email string
CreatedAt, UpdatedAt time.Time
}
var (
ErrAlreadyExists error
)
type Users interface {
Create(ctx context.Context, user User) error // can return ErrAlreadyExists
Update(ctx context.Context, user User) error
FindByEmail(ctx context.Context, email string) (User, error)
}
И уже внутри internal/infra/postgres реализация интерфейса:
package postgres
var _ entity.Users = (UsersRepo)(nil)
func NewUsersRepo( db sql.DB) UsersRepo {
return &UsersRepo{
db: db,
}
}
type UsersRepo struct {
db sql.DB
}
func (r UsersRepo) Create(ctx context.Context, user entity.User) error {
row, err := r.db.QueryRow("insert into users email) values ($1) returning id, email, created_at, updated_at", user.Email)
if err != nil {return err}
if err := row.Scan(&user.ID, &user.Email, &user.CreatedAt, &user.UpdatedAt); err != nil {return err}
return nil
}
Как-то так. Внутри репозитория можно хардкодить запросы, собирать их с помощью билдера и тд, разных подходов много, я тут написал самый тривиальный псевдокодный вариант. Весь прикол в том, чтобы отделить специфику реализации от самих операций над сущностью, с помощью интерфейса. Чтобы у тебе в бизнес-коде не появилось внезапно бд-специфичного кода.
Я бы с радостью заопенсорсил свой код, но у меня крупная закрытая контора финтех и такого конечно никогда не будет.
Давай попробую просто поотвечать на твои вопросы, немного псевдокодом.
> Как писать модульные/интеграционные тесты и тест-кейсы
Самое главное, разбить код на сценарии, чтобы понимать, что ты тестируешь. Далее берешь testify, и заводишь по сьюиту на сценарий, примерно так выходит:
type SuiteRegisterUser struct {
users entity.Users
client http.Client
}
func (s SuiteRegisterUser) BeforeTest(_, _ string) {
// делаешь инжекты в s, создаешь репозитории, поднимаешь сервер или мок-сервер если надо и всё такое
s.client = http.NewClient()
s.users = postgres.NewUsersRepo()
}
И соответственно начинаешь описывать различные кейсы конкретного сценария:
func (s SuiteRegisterUser) TestAlreadyExists() {
// подготовка данных, если необходимо
const email = "
ctx := context.Background()
s.Require.NoError(s.users.Create(ctx, &entity.User{Email: email}))
// производишь сценарий
_, err := s.client.Post("/register_user", map[string]interface{}{"email":emaiil})
// проверяешь результаты сценария, если вдруг нужно
s.Require().Error(err, "err_already_exists")
// в другом примере можно было бы найти юзера, чтобы убедиться, что он создался
}
Это пример полнофункционального юнит теста, при котором ожидается, что он поднимет сервер, законнектится к базе и проверит весь код в максимально боевых условиях. Конечно разные люди делают по разному, есть подходы, когда мокают базу, сервер и тд и тп.
Тут у тебя может возникнуть очевидный вопрос, как поднимать базу, если поднимать, я пробовал testcontainers и мне не понравилось, в итоге остановился на том, что в докере поднимаю прям постгрес (или локально или в пайплайне) и через переменные окружения прокидываю доступы в сам тест: TEST_DB_NAME=blabla go test ./...
> Как именовать функции интерфейсов репозиториев и подобное.
Интерфейсы репозиториев лежат в доменном слое, потому что это по сути набор операций над бизнес сущностями. Тут есть тонкости, модель может быть анемичной или rich, тебе придется прочитать про это отдельно, потому что люди делают по разному в зависимости от потребностей.
package entity
type User struct {
ID string
Email string
CreatedAt, UpdatedAt time.Time
}
var (
ErrAlreadyExists error
)
type Users interface {
Create(ctx context.Context, user User) error // can return ErrAlreadyExists
Update(ctx context.Context, user User) error
FindByEmail(ctx context.Context, email string) (User, error)
}
И уже внутри internal/infra/postgres реализация интерфейса:
package postgres
var _ entity.Users = (UsersRepo)(nil)
func NewUsersRepo( db sql.DB) UsersRepo {
return &UsersRepo{
db: db,
}
}
type UsersRepo struct {
db sql.DB
}
func (r UsersRepo) Create(ctx context.Context, user entity.User) error {
row, err := r.db.QueryRow("insert into users email) values ($1) returning id, email, created_at, updated_at", user.Email)
if err != nil {return err}
if err := row.Scan(&user.ID, &user.Email, &user.CreatedAt, &user.UpdatedAt); err != nil {return err}
return nil
}
Как-то так. Внутри репозитория можно хардкодить запросы, собирать их с помощью билдера и тд, разных подходов много, я тут написал самый тривиальный псевдокодный вариант. Весь прикол в том, чтобы отделить специфику реализации от самих операций над сущностью, с помощью интерфейса. Чтобы у тебе в бизнес-коде не появилось внезапно бд-специфичного кода.
привет анон! подскажи пожалуйста, вопрос не по теме будет, а в чем разница между мидлтварями сервисами, репозиторий я понял, эта та сущность которя с бд работает, а в чем разница между ними то обеими, так то получается они логику сервиса обрабатывают не?
Не совсем понял вопрос, в чём разница между миддлварями и сервисами? Или между сервисами и репозиториями?
Первые два - это совсем разные вещи.
Middleware это просто прикладной паттерн, который говорит о том, что бывают "прослойки" с полезной нагрузкой для каких-нибудь вызовов. Получается что-то очень схожее с декораторами.
А сервисы это некие отдельные логические единицы, относящиеся к теме моделирования предметной области.
Так, нет, давай зайдём с другого конца. Когда ты пишешь какой-то серьезный софт, то ты действуешь в терминах предметной области, скажем, магазина. Это означает, что вообще в бизнесе существуют такие вещи как "заказ", "доставка", "покупатель" и тд и тп, это история даже не про код, это часть реального мира.
И ты для решения каких-то бизнес задач (скажем, интернет магазина), эту предметную область моделируешь. Если ты слышал когда-нибудь термин "модель", то скорее всего её кто-нибудь безграмотно употреблял в смысле "штука, которая хранится в базе" или "модель бд". А на самом деле весь твой интернет магазин - это некая модель бизнес процессов, как у физиков, когда они вулкан моделируют какой-нибудь к примеру.
Соответственно, у тебя есть какой-то юзкейз ака сценарий, скажем, "оплата заказа" и тебе нужно его выразить его средствами твоей модели.
Тут мы придём к анемичным или богатым моделям, про которые я советовал почитать выше.
Если модель богатая, тогда у тебя всё должно быть выражено напрямую через сущности. Что-то вроде такого:
function ScenarioInstantPurchase(user, product, payment) {
cart := user.GetCart()
cart.AddProduct(product)
order := cart.CreateOrder()
order.AddPayment(payment)
order.CalculateDelivery()
// ... и тд
}
Это очень прикольно, и академически правильно, но так делать очень сложно по многим причинам. Поэтому люди часто переходят к анемичной модели, когда сами сущности хранят в себе только данные, а логика работы с ними выносится в отдельные сущности, ака сервисы:
function (s *Scenario) ScenarioInstantPurchase(user, product, payment) {
cart := s.cart.AddProduct(cart, product)
order := s.orders.CreateFromCart(cart)
s.payments.CreateForOrder(payment, order)
s.delivery.Calculate(order)
// ... и тд
}
и здесь уже репозитории и сервисы похожи, иногда до степени смешения, на код выше посмотришь и не поймешь, что такое cart - это сервис или репозиторий?
В целом я обычно, когда использую анемичную модель, яаще всего стараюсь держать репозитории максимально простыми и максимально ближе к данным, а в сервисы выношу какие-то куски прям явной бизнес логики, какие-нибудь рантайм вычисления доставки, алгоритмы и тд и тп.
Советую смотреть на это так, что пакет domain это такой фреймворк для сборки бизнес процессов, в нём есть сущности (entity), хранилища для непосредственных операций над сущностями (разнообразные круды и селекты) - это репозитории и сервисы, хранящие в себе прям логику.
И из этих кубиков ты в слое приложения (app) собираешь сценарии ака юзкейзы. Которые потом будешь вызывать откуда тебе там надо, из сети, консоли, интерфейса, тд
Не совсем понял вопрос, в чём разница между миддлварями и сервисами? Или между сервисами и репозиториями?
Первые два - это совсем разные вещи.
Middleware это просто прикладной паттерн, который говорит о том, что бывают "прослойки" с полезной нагрузкой для каких-нибудь вызовов. Получается что-то очень схожее с декораторами.
А сервисы это некие отдельные логические единицы, относящиеся к теме моделирования предметной области.
Так, нет, давай зайдём с другого конца. Когда ты пишешь какой-то серьезный софт, то ты действуешь в терминах предметной области, скажем, магазина. Это означает, что вообще в бизнесе существуют такие вещи как "заказ", "доставка", "покупатель" и тд и тп, это история даже не про код, это часть реального мира.
И ты для решения каких-то бизнес задач (скажем, интернет магазина), эту предметную область моделируешь. Если ты слышал когда-нибудь термин "модель", то скорее всего её кто-нибудь безграмотно употреблял в смысле "штука, которая хранится в базе" или "модель бд". А на самом деле весь твой интернет магазин - это некая модель бизнес процессов, как у физиков, когда они вулкан моделируют какой-нибудь к примеру.
Соответственно, у тебя есть какой-то юзкейз ака сценарий, скажем, "оплата заказа" и тебе нужно его выразить его средствами твоей модели.
Тут мы придём к анемичным или богатым моделям, про которые я советовал почитать выше.
Если модель богатая, тогда у тебя всё должно быть выражено напрямую через сущности. Что-то вроде такого:
function ScenarioInstantPurchase(user, product, payment) {
cart := user.GetCart()
cart.AddProduct(product)
order := cart.CreateOrder()
order.AddPayment(payment)
order.CalculateDelivery()
// ... и тд
}
Это очень прикольно, и академически правильно, но так делать очень сложно по многим причинам. Поэтому люди часто переходят к анемичной модели, когда сами сущности хранят в себе только данные, а логика работы с ними выносится в отдельные сущности, ака сервисы:
function (s *Scenario) ScenarioInstantPurchase(user, product, payment) {
cart := s.cart.AddProduct(cart, product)
order := s.orders.CreateFromCart(cart)
s.payments.CreateForOrder(payment, order)
s.delivery.Calculate(order)
// ... и тд
}
и здесь уже репозитории и сервисы похожи, иногда до степени смешения, на код выше посмотришь и не поймешь, что такое cart - это сервис или репозиторий?
В целом я обычно, когда использую анемичную модель, яаще всего стараюсь держать репозитории максимально простыми и максимально ближе к данным, а в сервисы выношу какие-то куски прям явной бизнес логики, какие-нибудь рантайм вычисления доставки, алгоритмы и тд и тп.
Советую смотреть на это так, что пакет domain это такой фреймворк для сборки бизнес процессов, в нём есть сущности (entity), хранилища для непосредственных операций над сущностями (разнообразные круды и селекты) - это репозитории и сервисы, хранящие в себе прям логику.
И из этих кубиков ты в слое приложения (app) собираешь сценарии ака юзкейзы. Которые потом будешь вызывать откуда тебе там надо, из сети, консоли, интерфейса, тд
> Советую смотреть на это так, что пакет domain это такой фреймворк для сборки бизнес процессов, в нём есть сущности (entity), хранилища для непосредственных операций над сущностями (разнообразные круды и селекты) - это репозитории и сервисы, хранящие в себе прям логику.
В смысле три разные вещи:
1) сущности - описывают объекты
2) репозитории - напрямую чёто делают с объектами
3) сервисы - какие-то логические штуки, вычисляторы, организаторы, тд
Спасибо тебе большое за такой развернутый ответ!
Такой ещё вопрос (был бы рад если и другие опытные гоферы подскажут) пишу свой CRUD сервис с 8-10 ендпоинтами, БД постгрес, авторизация и регистрация присутствует (JWT токен использую), все изменения в гитхаб пушу стабильно. Тянет ли это на сильного джуна? Сейчас работаю тестером нагрузочником бекенд сервисов в одном из банков в рф (зеленый если что), вот думаю перекатиться в разработку на гошке
Я не опытный гофер (и не этот анон>>393317), просто вонаби гофер, даже не из ИТ. В общем погружаюсь уже около 2 лет, первый из которых страдал херней на питоне и Сях, а последний сижу за Го, к сожалению не занимаюсь каждый день, из за чего растянул процесс вката пиздец.
Так вот. Недавно услышал такой совет: "просто и без задней мысли начинаешь искать работу". И вообще забить на все, потому что учиться можно бесконечно. Исходя из того, что ты написал, я бы начинал искать работу прям сейчас. Еще и прошлый опыт +- пересекается.
пчел спасибо за поддержку, но ты наверное и сам знаешь как трудно найти работу на гофера, мой единственный выход это пилить пет проекты. Ты удивишься но мой опыт где я больше года занимаюсь НТ и успел ещё полгода АТ позаниматься, вообще ни в пизду ни в красную армию оказалось в контескте вакансии на гофера. Так что как-то так оказалось....
480x480, 0:09
волк слабее льва и тигра но на джаваскрипте не пишет бекенд
Почему бы и нет? Главное помнить, что пет проект - это всего лишь пет проект, это хорошо, но ещё не всё. Вывод, что ты "сильный джун" будет делать чел, который тебя собеседует. И да, разница между сильным джуном и миддлом довольно невелика и вероятно в основном в величине зп :D
С моей точки зрения грейды различаются так:
1 стажер вообще ничего не знает
2 джун что-то знает и что-то умеет, но как это применить - нет
3 миддл стабильно и правильно делает задачу по техническому описанию
4 сеньор и сам себе техническую задачу напишет, от бизнеса ему нужен только кивок в нужную сторону
Соответственно тут скорее вопрос к тому, что ты знаешь и умеешь, а твой проект на гитхабе - это просто способ увеличить свои шансы попасть на интервью или пройти его, если он написан хорошо, конечно.
Кстати вообще не факт, что тебе нужен jwt или что ты его правильно используешь. Просто к слову, если ты юзаешь что-то, будь готов ответить, почему ты это используешь и чем оно лучше другого.
Если да, то можно ли в таком случае запускать вложенный ServeHTTP в отдельной горутине (пометил жирным)? Сохранится ли "копия" хендлера для активных вызовов (пришедших до запроса на Update, но еще не отработавших) или ее изменение в структуре вызовет сатану?
type UpdHandler struct {
____mu sync.RWMutex
____h http.Handler
}
func (uh UpdHandler) Update(h http.Handler) {
____uh.mu.Lock()
____uh.h = h
____uh.mu.Unlock()
}
func (uh UpdHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
____uh.mu.RLock()
____uh.ServeHTTP(w, r) // --> go uh.ServeHTTP(w,r)
____uh.mu.RUnlock()
}
Опечатался, внутри ServeHTTP естественно идет UpdHandler.h.ServeHTTP, рекурсии нет
в моем маня-представлении это будет учебный проект для маслят которые хотят вкатиться в нагрузочное тестирование. Так как начинающим НТшникам нечего тестировать. Если тем же условным мануал куа можно любой сайт открыть и протестить то с НТшниками посложнее, нагружаемый сервис может подумать что это дудос и забаних нахой айпишник маслёнка НТшника. А так как сервисы на архитектуре рест самые популярные в бекенде, то им достаточно будет развернуть мой проект на той же виртуалке и потестить написав скрипты на jmeter, loadrunner, k6 и т.д.
как тебе идея?
Хз, зачем кому-то так заморачиваться. Хочешь что-то нагрузочно протестить - делаешь `docker run -p 3000:80 ealen/echo-server` и вперед. Ну или nginx в докере поднять, со специфичными конфигами.
Так-то объект тестирования внутри вообще не должен быть ни гибким, ни как-то особо написанным. Просто какой-то тупой http сервер с каким-то профилем нагрузки.
Максимум
go run server.go
где server.go это
func main() {
http.HandleFunc("/hello", func (w http.ResponseWriter, req *http.Request) {
// ну тут можно ещё в базу стукнуться или семафор на 100 одновременных запросов поднять для тестов.
fmt.Fprintf(w, "hello\n")
})
http.ListenAndServe(":8080", nil)
}
В-общем, если ты делаешь пет проект как тестировщик, не программируй, а делай штуку для тестирования, максимум пользы, минимум излишеств. Не нужно тут ничего самому программировать, просто предоставить людям заглушку для тестов.
А если ты делаешь пет проект как программист, то тогда это не должно быть учебным пособием для тестировшиков, а должен быть некий близкий к реальности программный продукт, который покажет твои навыки писать, собственно, программные продукты. Сделай, не знаю, тот же интернет магазин к примеру, бложек, туду лист, куча вариантов. Я в качестве своего первого пет проекта лет уже почти 10 назад сделал копию музыки вконтакте, сервис, в который можно было заливать файлики с музыкой и потом слушать их онлайн ^_^
Из спеки rwmutex:
> If a goroutine holds a RWMutex for reading and another goroutine might call Lock, no goroutine should expect to be able to acquire a read lock until the initial read lock is released.
Всё ок будет.
бля оч круто звучит слушай. я тебя понял, просто моя основная идея была в том чтобы написать сервис который был бы близок к реальному продукту, чтобы как ты сказал прокачать навыки программирования а уже потом только пришла в голову предложить стажерам качать навыки НТ на нем. Но все же спасибо за такой развернутый ответ :)
$ migrate create -ext sql -dir db/migrations -seq create_users_table
> error: unknown option `-x'
Аноны, с чем это может быть связанно ? Не могу сделать миграции, хотя делаю все согласно доке, какая то фигня с флагом. Подскажите, пожалуйста
тебе обновление хендлера нужно блочить во время выполнения?
просто делаешь
RLock
h := uh
rUnlock
h.ServeHTTP
а твоя штука с горутиной наверняка будет неожиданно работать, если где-то ожидается, что servehttp блочит на время выполнения.
>а твоя штука с горутиной наверняка будет неожиданно работать, если где-то ожидается, что servehttp блочит на время выполнения.
как пример мидлвары которые после servehttp что-то делают например длительность измеряют.
В идеале обновлять одновременно с выполнением. Что бы запросы направленные до запроса обновления корректно завершились.
>твой вариант
http.Handler это же интерфейс и мы просто скопируем ссылку на функцию. И после RUnlock ее свободно могут изменить -> в h.ServeHTTP будет гонка. Разве не так?
Вот как раз таки из-за этого и боюсь, что вызов Апдейта будет отложен на неопределенное время. Или Lock встает в своего рода очередь и последующие запросы на RLock будут выполнены после лока на запись?
> Или Lock встает в своего рода очередь и последующие запросы на RLock будут выполнены после лока на запись?
Да
А что такое migrate? Таких пакетов десятки.
Пока вслепую вангану, что должно быть `migrate -ext sql create -dir db/migrations -seq create_users_table` либо `--ext`. А вообще читай доку конкретного пакета и/или его гитхаб.
>http.Handler это же интерфейс и мы просто скопируем ссылку на функцию. И после RUnlock ее свободно могут изменить -> в h.ServeHTTP будет гонка. Разве не так?
поинтер могут изменить, но это не меняет значение на которое этот поинтер указывал. с интерфейсом должно всё быть аналогично.
var x any = 1
y := x
x = 3
fmt.Println(y)
Привет, анончики.
Думаю над перекатом в Го.
Подскажите, какая область применения этого языка? Какую работёнку в среднем можно получить, чем придётся заниматься? Заранее благодарю.
жсономешалки.
всякие микро серверсы для бек енда, реже системные и плат форменные утилиты уровня NIH ансиблов, интеграции с девайсами уровня "есть драйвер для сканера/кассы, нужно предоставить к ним синхронную/асинхронную апишку" что по сути тот же бекенд
Эта штука делает миграции и накатывает их, я конечно не особо понимаю зачем, ведь sql я и так руками написал,
я чисто из документации копировал этот код и он сука не работает, у людей в ютубе даже работает.
Я вообще думаю отказаться от этих утилит, по сути, что она автоматизирует? Ничего, Только файлы создает
Значит, ты неправильно её используешь.
Давай начнём с того, что есть несколько паттернов работы с базой и для начала нужно определиться, какой у тебя и правильно подобрать под него тулчейн.
1) Код-first, он же orm'ный, когда ты сначала описываешь сущности в коде, а потом некий (возможно самописный, возможно либа типа gorm, не к ночи будь помянут) код маппит их в базу. Соответственно, этот же код может накатывать и/или создавать миграции. У того же gorm (только умоляю не начни его юзать, это порождение Сатаны, а не либа) есть метод AutoMigrate, который сам увидит новые поля у сущностей и сам их накатит. Более правильный вариант, это конечно прям генерировать миграции и накатывать их отдельно;
2) DB-first, когда ты руками пишешь миграции и вообще модифицируешь базу данных, а потом некий код маппит данные их базы в код. Например, как sqlboiler, который генерирует гошные структуры по схеме бд (этот пакет в целом годный, я юзал);
3) Смешанный, когда ты руками описываешь структуру бд, руками описываешь гошные сущности, а потом настраиваешь маппер между ними. Самый гибкий, но и самый требовательный к прямоте рук.
Но при всех этих 3 подходах, у тебя как правило есть задача "накатить миграции", то есть, посмотреть, что уже было накачено, накатить недостающее, если не получилось на катить - то откатиться назад к предыдущей точке. Какие-то миграции могут быть кодовые, какие-то чисто sql, какие-то должны выполняться внутри транзакции, а какие-то нет.
Ты мне до сих я же блять прямо спросил не сказал, что за пакет ты юзаешь, пока что я вангану что это https://github.com/golang-migrate/migrate и он делает именно это, хранит в базе таблицу с уже накатанными миграциями и умет апгрейдить/даунгрейдить состояние системы до нужной точки. Это можно написать самому, но внешний пакет здесь нормальная тема, потому что этот код в целом одинаковый во всех проектах.
tldr: создавать файлики это не главное, главная задача - это "накатки и откатки миграций", с разными опциями. Иногда её решают ормки, иначе, есть смысл использовать внешние тулзы для таких дел.
>>394260
Несколько специфических областей:
1) Блокчейн и крипта.
2) Кубернетес и прочие девопс штуки;
3) Написание бекендов в компаниях среднего и большого размера, как правило "микросервисов", хотя я бы не обращал внимания на этот баззворд, в 99% случае люди не вполне понимают, что говорят. Кажется, что наибольшая доля го в финтехе, и традиционном и всяких модных необанках. Но при этом крупные конторы часто юзают, в РФ - те же Авито, Яндекс (яндекс.еда вроде), mail.ru, 2gis.
Единственное, надо понимать, что у пехапешников, js'ников и джавистов есть вариант устроится джуном в какую-нибудь мелкую контору, местячковый аутсорс за еду и там за год набраться какого-никакого опыта. С го такое скорее всего не проканает, аутсорса на го почти нет, вакансий больше в крупняке.
Значит, ты неправильно её используешь.
Давай начнём с того, что есть несколько паттернов работы с базой и для начала нужно определиться, какой у тебя и правильно подобрать под него тулчейн.
1) Код-first, он же orm'ный, когда ты сначала описываешь сущности в коде, а потом некий (возможно самописный, возможно либа типа gorm, не к ночи будь помянут) код маппит их в базу. Соответственно, этот же код может накатывать и/или создавать миграции. У того же gorm (только умоляю не начни его юзать, это порождение Сатаны, а не либа) есть метод AutoMigrate, который сам увидит новые поля у сущностей и сам их накатит. Более правильный вариант, это конечно прям генерировать миграции и накатывать их отдельно;
2) DB-first, когда ты руками пишешь миграции и вообще модифицируешь базу данных, а потом некий код маппит данные их базы в код. Например, как sqlboiler, который генерирует гошные структуры по схеме бд (этот пакет в целом годный, я юзал);
3) Смешанный, когда ты руками описываешь структуру бд, руками описываешь гошные сущности, а потом настраиваешь маппер между ними. Самый гибкий, но и самый требовательный к прямоте рук.
Но при всех этих 3 подходах, у тебя как правило есть задача "накатить миграции", то есть, посмотреть, что уже было накачено, накатить недостающее, если не получилось на катить - то откатиться назад к предыдущей точке. Какие-то миграции могут быть кодовые, какие-то чисто sql, какие-то должны выполняться внутри транзакции, а какие-то нет.
Ты мне до сих я же блять прямо спросил не сказал, что за пакет ты юзаешь, пока что я вангану что это https://github.com/golang-migrate/migrate и он делает именно это, хранит в базе таблицу с уже накатанными миграциями и умет апгрейдить/даунгрейдить состояние системы до нужной точки. Это можно написать самому, но внешний пакет здесь нормальная тема, потому что этот код в целом одинаковый во всех проектах.
tldr: создавать файлики это не главное, главная задача - это "накатки и откатки миграций", с разными опциями. Иногда её решают ормки, иначе, есть смысл использовать внешние тулзы для таких дел.
>>394260
Несколько специфических областей:
1) Блокчейн и крипта.
2) Кубернетес и прочие девопс штуки;
3) Написание бекендов в компаниях среднего и большого размера, как правило "микросервисов", хотя я бы не обращал внимания на этот баззворд, в 99% случае люди не вполне понимают, что говорят. Кажется, что наибольшая доля го в финтехе, и традиционном и всяких модных необанках. Но при этом крупные конторы часто юзают, в РФ - те же Авито, Яндекс (яндекс.еда вроде), mail.ru, 2gis.
Единственное, надо понимать, что у пехапешников, js'ников и джавистов есть вариант устроится джуном в какую-нибудь мелкую контору, местячковый аутсорс за еду и там за год набраться какого-никакого опыта. С го такое скорее всего не проканает, аутсорса на го почти нет, вакансий больше в крупняке.
У меня третий подход, ОРМ мне противно использовать, да, его, и он именно не работает, хотя по пути нарастания сложности мне удалось добиться от него генерацию JS файлов, но это мб другой какой-то пакет? Посоветуй альтернативу этому пакету
Я ж именно пониманием этого всего дошел, а не от балды хыхыхы че зачем
Вообще, спасибо за такой развернутый ответ, видать этот пакет migrate походу фигово работает на макоси у меня, просто не заводится и все, может есть приемлемая альтернатива? Не хочу генерировать го, хватит sql , мигрирую постгресс базу,
Вообще, мне б для тупых объяснить вообще как эти миграции работают в плане отката-наката, ведь речь о обновлении базы, иногда нужно прописывать у поля что-то вроде default="1234", бо иначе не заведется, или возникнет конфликт какой, хз, думаю приколов там достаточно
Могу я вообще понимать миграции как что-то типа гита для баз данных?
Не понял про default и конфликты, у тебя там явно какая-то лажа происходит. И уж тем более не понял, причём тут JS.
Если не нравится migrate, ну используй goose, в целом, одна фигня.
Миграция - это грубо говоря операция изменения структуры бд. В серьезных проектах у тебя есть код, который зависит от структуры бд, поэтому тебе нужно при релизе кода, который скажем начинает работать с этой таблицей, эту таблицу создать. Отдаленное сходство с гитом наверное есть, не знаю, сложно сравнивать.
Ты же можешь посмотреть прям по коду, что этот тул делает.
Грубо говоря, ты создаешь файлики:
001_create_table_users.sql
002_add_admin_user.sql
003_add_users_email_fields.sql
И тогда у тебя база может быть в 4 состояниях, 000 - где ничего нет, 001 - где отработала только первая миграця и тп. И migrate просто по очереди накатывает недостающие миграции. Проверяет, что накатить, а что нет он просто - заводит ещё одну таблицу, в которой хранит инфу, что он уже накатил, а что нет. В goose эта таблица так и называется, goose_db_version, по-моему.
Спасибо, теперь намного яснее, такой кайф с питончика и опыта тестирования на джаве переходить на го
мне каежтся у тебя конфликт в патхе. ты вообще тот мигрейт вызываешь той версии которые ты думаешь?
Я кстати вообще не люблю использовать migrate отдельным тулзом, больше нравится в cmd отдельный эндпоинт для наката миграций юзать. Тот же goose можно и как либу использовать.
у нас всё это делается при раскатке автоматом. разработчики тупо файлики в папке создают, так что необходимость ручного вызова миграций кроме как для отладки от меня начала ускользать вообще. а для отладки я могу шаг тупо на базе прогнать.
Я про другое. Не нужно в систему ставить отдельный тул, у тебя есть общий бинарник, например `go build -o users`
И соответственно `users serve` поднимает сервер, а `users migrate` накатывает миграции. Как их накатывать, руками или нет - вопрос десятый я вот пре-хуком helm'а это делаю.
Вопрос в том, нужно ли отдельно на сервер ставить ну или в докере запускать, один хрен внешняя штука goose и делать goose migrate или нет. Мой ответ: не нужно.
по моему мнению, учить сервис накатывать миграции и захламлять код, и тем более иметь ручку для этого - не нужно. накат миграции можно реализовать на любом языке и просто переиспользовать во всех сервисах, не давая разработчику с чешущимися руками лишнего повода лезть в по сути бойлерплейтный код. у нас при деплое отдельный контейнер с накатчиком поднимается перед стартом сервиса или вроде того. бинарники у нас тоже не общие, апишка крутится в одном, всякие очереди расхлебываются другим. миграцию накатывал бы третий.
1. Идея использовать свою структуру и интерфейс, чтобы открывать файл, использовать log.SetOutput(file) ясна. Непонятно только, что в этом плохого?
2. Можно использовать различные фреймворки и там все круто сделано и т.д. и т.п., но чем это неудобно может быть в проектах? Типа зачем кастомный логгер приводить к стандартному логгеру?
3. Как передавать логгер как io.Writer, если тогда у него не будут работать методы, кроме Write(p []bytes)?
Автору нахуя-то нужно несколько логеров в проекте. Поэтому он решил сделать дженерик логгер (на самом деле просто открыватель файла) и передавать его другим логгерам.
>2. Можно использовать различные фреймворки и там все круто сделано и т.д. и т.п., но чем это неудобно может быть в проектах? Типа зачем кастомный логгер приводить к стандартному логгеру?
Привести к единому типу (открытому файлу лол). А логгер сам разбирается как и что писать в этот файл. В конечном счете взаимодействие идет через логгер библиотеку.
Передавая io.Writer ты просто сообщаешь логгеру, куда писать инфу.
Вопрос не в тему, ты под Виндой работаешь? Просто интересно)
Какой-то не такой permition 0666?
>Какой-то не такой permition 0666?
Да вроде такой как нужно, только не понятно что это значит в контексте Windows.
>Да, а к чему это, мне интересно
Не знаю, интуицию тренирую. Просто насколько мне кажется, Windows затрудняет восприятие абстракций. Например, почему писать в стандартный поток вывода логи - ок.
Если ты опытный анон, который свитчится в го, извини. Но для новичка, думаю, разрабатывать на Го будет гораздо полезнее и понятнее под Unix, что бы сразу привыкать к продакшн-инфраструктуре.
Я пробовал линукс (Ubuntu) на виртуалке, ну его нахуй.
Чето снес - пиздец системе, VSC я ниосилил, а мне надо писать на C++ изредка (CLion говнище какое-то).
Перекат на линукс не то, чтобы проблема, просто на это опять уйдет время на настройку всякого вместо программирования. Легче это сделать когда я немного освою golang.
Ну то есть должно получиться что-то типа такого?
>Привести к единому типу (открытому файлу лол). А логгер сам разбирается как и что писать в этот файл. В конечном счете взаимодействие идет через логгер библиотеку.
Если тебе не нужно несколько логгеров в программе (99.999% кейсов), то просто открываешь файл куда хочешь писать и передаешь его либе для логгинга. И вызываешь методы либы. Если есть сомнения насчет либы - бери логрус и не парься
Хотя обычно принято писать в stdout. Более опытные аноны поправят, если не так
>type LoggerInterface interface
ты читаеш какую-то еботу.
1. поработаешь три месяца и определишься с тем логгером, который тебе нравится. тебе нахуй никогда не нужно будет внезапно переписывать своё логирование на зап вместо зеролога или использовать разные в разных частях программы.
2. в серьезной компании будет демократически выбранный корпоративный логгер которым все пользуются и тебе об этой еботе думать даже не придется
3. так делать не нужно. это логгер должен райтер принимать.
я так и представляю, затаскиваешь в проект либу, которая вместо обычного стд/логрусподобного интерфейса логгера принимает подобие райтера и хочет в него писать что-то в своём особенном формате, когда остальной проект пишет жсончики или наоборот.
>>395072
>TxtWriter
есть же os.Stdout, который то же самое делает
>TxtWriter
>есть же os.Stdout, который то же самое делает
Я поэтому про Винду и написал, как правило люди именно на винде не вдупляют, как можно работать с файлами, что такое потоки ввода вывода и что можно с ними делать.
А если начинать с VisualBasic/C# то можно вообще научиться заводить пустые окна на выполнение любой операции. А юникс потом как рокет сайнс воспринимается, либо наступает просветление и человек больше виндоус не запускает.
Аноны гоферы подскажите, решил почитать статейки типа (вопросы по голанг на собеседовании). И наткнулся на эту статью, с таким вот ответом. Прошу подсказать, за такое по ебучке нужно давать?
хуйня какая-то, наверняка ебан с яндекс.толоки писал.
палю реальные примеры вопросов от одной из компаний https://pastebin.com/ida9Lezs
крайне признателен анончег!
Ну и в общем и целом интересно, такое вообще часто в России применяется? Мне что-то сложно представить вебмакакена, который помимо CRUDа как-то там чето в многопотоке запускает удаленно
максимум классика. в ВБ у нас два ДЦ было, в авито 3. плюс N реплик сервиса которые между ними раскидываются.
в редких случаях когда сервисы для ПК пишеш (например для окон ПВЗ например), то можно считать что ты центр мира с одной репликой.
>ВБ, Авито
Как там работается? Про ВБ очень плохое слышал, пойдет туда джуном перекантоваться полгода-год?
Об Авито мое представление получше, не ошибаюсь?
https://hh.ru/vacancy/66610729?from=vacancy_search_list&hhtmFrom=vacancy_search_list&query=golang стажер
>за лето
>алгосы, базу golang, gin + postgres + брокер сообщений
Очень оптимистично. Я бы убрал "за лето" из уравнения. Тогда вполне.
И почему именно в Озон, если там реджект или нет вакансий? Забить хуй?)
Нет вакансий на стажера, есть на джуна тока
Ну хотя бы к зиме надо осилить, я второкурс пи, что-то мы проходили, если что
по моему опыту в ВБ хуета была, но я тоже склоняюсь к тому, что это зависит от отдела. никаких дейликов, никаких код ревью, нихуя не было, тупо писали в телеге задачку и всё. это при том, что у меня нулевой опыт работы был. технологии там вполне индастри стандарт, так что поразбираться интересно было и съебать после годика с плюсом к ЗП было легко. в авито культура/процессы топ
Какие проекты надо в портфолио иметь?
Что можно запилить в соло чтобы прокачаться? (инб4 ничего волчистность)
Очень надо работу найти до конца года, в бекграунде круд на рельсах, тудушка на реакте, нравится гошечка, думаю о суициде.
телеграм бота для продажи нелегального хардкор порно. работой начальник колонии обеспечит.
Звучит настолько банально, что небось уже весь рынок захвачен и поделён.
я правильно понимаю что горутины легковесны из-за следующих факторов
1. context switch происходит не на уровне ОС а на уровне потока на котором крутятся горутины
2. за счет малого стека на 2 кб при запуске горутины
так? или я нифуя не понял?
Для тебя выкопал анончег
>ты создаешь файлики
Гохеры, вы серьезно жрете это говно? Не ТЫ блять создаешь файлики, а фреймворк/либа это делает за тебя, и делает он это на основе схем моделей которые ты написал, и работаешь блять ты не с сырым sql и с моделями, и генерятся не просто sql-файлики а файлы миграции, в которых также по возможности имеется опция даунгрейда
Это делает любая нормальная система миграций в любом нормальном ЯПе, даже в Петухоне
>когда нам завезут дженерики
Я чего-то не понимаю? Или вам буквально недавно завезли их?
Опхуй уже хуй знает сколько не обновляет шапку.
Пусть завозят красивые.
из-за голандопидоров их всё равно невозможно использовать
>ААААААААААА У МЕНЯ КРАСНЫЕ БУКОВКИ ИЗ-ЗА ЖЕНЕРИКОВ ААААААААААААААААААААА
Почему не liteide?
Что имеем:
ИМХО неплохо знаю базу и стандартную библиотеку (http, os, flag, IO, sync и проч.), Gin базово совсем, но, думаю, подразобраться будет не проблема. Не гнушаюсь лезть в исходники и разбирать устройство либ.
По concurrency активно испльзую Mutex/RWmutex, WaitGroup, один раз пришлось использовать Atomic. С каналами работал значительно меньше, но понимаю.
Из General:
Git (базово): clone, pull, commit, push
Linux: активно использую, терминала не боюсь, но без Баш-скриптов и хитрых пайпов.
SQL (базово): фильтрация, агрегация, простые join’ы
Что планирую подтягивать:
1. SQL, Postgres, MongoDB, правильная архитектура данных и проч. Стоит ли вообще в NoSQL на начальном этапе лезть (выглядит конечно поудобнее, но всем нужен СКЛ)
2. Архитектура веб-приложений, Gin (или лучше что-то другое?), DDD
3. Алгоритмы, Problem Solving (сейчас быстро решаю задачки уровня Easy, иногда получается Medium). Знаю в крупняке, где юзают Го алгоритмы любят.
4. Docker
5. Правильная организация тестирования и логирования.
6. Git
В общем, буду благодарен, если поможете расставить приоритеты и необходимую глубину знаний по этим направлениям для начинающего. Возможно что-то важное забыл. Что можно оставить на потом/изучать уже по мере работы?
Знаю мнение здешнее, что на Го джуны не нужны, тем не менее вакансии периодически встречаю. Буду пробовать.
У меня тоже самое как у тебя анончег. Только на пару месяцев дольше изучаю. Могу посоветовать написать рест хуйню, прям конкретно прокачаешься во всем. Сам сделал чувствую себя ниибаца гейнием
Неплохой совет, надо бы, но писать очередной тудулист или "библиотеку" не интересно, да и не впечатлит никого особо. Вполне могут счесть за копипасту.
А достойный проект в голову не приходит. Либо что-то, где вообще не нужна БД, либо 1-2 хендлера.
Либо заумная херня, на которую желательно знать MQ, и как организовывать соответствующую архитектуру (еще один топик для изучения), писать 2-3 месяца и в итоге говно окажется, поскольку задачка не по скилу.
Да, рест хуйня будет промежуточным проектом сечешь? Я вот тоже думал что у меня будет максимум 3-4 чмоэндпоинтов но в итоге перевалило за 8, попробуй аля клин архитекчур реализовать, короче норм тема, за 1-2 недели норм тему сделаешь
>Gin
пока вы все гугляли с друзьями я учил хттп роутер
пока вы женились я учил хттп роутер
устроился @ на работе rpc
Если на собесе серьезно спизданешь что работаешь под виндой - тебя обольют смуззи и сразу переведут в чуханы
собрался быть бекендером - осваивай UNIX
Типа он как-то создает новые зеленые потоки из нативных или что, не особо шарю в этом просто, подскажите.
И что значит рантайм го приостанавливает горутины при блоке и возобнавляет при разблокировке? Блокировке чего? (пик 2)
Кстати, что можете посоветовать в общем и целом по многопотоку, (native threads, green threads), но чтобы не оч дохуя по объему
плюсую этого анониса, опытные пчелы призываю вас на помощь по этим вопросам
Так же в тему добавлю вопрос
Имеет ли смысл запускать в гоурутинах bash скрипты? То бишь что-то вроде
go func () {cmd.Exec(....)} или даж с контекстом
С одной стороны запускать их в отдельном треде будет не очень, так как скриптов может быть много.
Иными словами, делаем /get на какой-то /handler1 и надо еще на машине кое что запустить и желательно проконтроллировать, как это лучше реализовать?
>Ну ладно закончились M зеленых потоков, дальше-то что?
ну если программе больше нечего делать, то либо программа выходит, либо программа выходит с fatal error: no goroutines (main called runtime.Goexit) - deadlock!
>И что значит рантайм го приостанавливает горутины при блоке и возобнавляет при разблокировке? Блокировке чего? (пик 2)
ну допустим горутина делает блокирующий сискол. тут два варианта - если сискол на самом деле блокирующий, то у тебя блокируется весь тред с горутиной и рантайм создает новый.
если сискол не блокирующий, то сделавшая сискол горутина все равно перестает выполняться и тред подхватывает другую, пока нетполлеру не придет уведомление, что едро готово и горутину которая хотела сделать сискол нужно шедулить.
>>399929
>go func () {cmd.Exec(....)}
смысла нет. есть cmd.Start специально для этого. и вообще на каждый скрипт все равно новый процесс создается, так что экономия тут такая себе.
ок, понял, но вот чего не понял.
https://pkg.go.dev/os/exec#Cmd.Start
Чем тогда он отличается от https://pkg.go.dev/os/exec#CommandContext ?
С Контекстом я всего лишь могу чуть более гибко решить свою задачу выходит, В случае cmd.Start получается я могу уйти в бесконечное ожидание? Но в случае контекста я явно задаю условие
это разные вещи. CommandContext инициализирует команду, Start её запускает, Wait ждет завершения.
если ты про Command, то да, без контекста с отменой/таймаутом можешь навечно заблочиться пока yes печатает свои строчки. но команда без контекста тебе может пригодиться, если ты сам хочешь обработать отмену контекста и отправить sigterm вместо sigkill. тут уже CommandContext(context.Background, ...) или Command(...) на твой выбор.
Получается в структуре нужно заводить поле с конструктором контекста типа
type struct {
...
____DefaultCtx func()context.Context
}
или можно как-то более изящно?
Так и не понял, чего ты хочешь. Если нужен таймаут - ну бери его и указывай сразу где нужно. Если у тебя сервер, то можешь middleware с контекстом для нужных роутов прокинуть, теоретически.
Хочу вкатиться на стажера, это вообще мне будет как + на собесе или это никому нахуй не нужно и никто на это смотреть не будет?
Книга из оп-поста "Язык программирования Go | Керниган Брайан У., Донован Алан А. А.", говорят, уже устарела.
>1.18
>на русском
>печатное
>для языка который от версии к версии практически не меняется, в который кроме контекста (за 5 минут можно разобраться), модулей (за 5 минут можно разобраться) и женериков (за 10 минут можно разобраться) ничего особо и не добавили
чет не звучит как пет проект, а как тупо репа чтобы гитхаб пустым не был уровня ответов к aoc/литкоду. если как либу оформишь с чем-то полезным вроде фильтра блума то мб.
Фильтр Блума, деревья, RMQ, LCA, алгоритмы поиска кратчайшего пути, ещё криптография скорее всего. Только если я нахуячу этого всегда там репозиторий оч большой будет, не заебно будет в теории даже для того, кто захочет этим воспользоваться?
поменять с последними элементами и обрезать слайс
Поскреби гофера - найдёшь джависта.
Задача - динамически менять кронтаб от суперпользователя, но при этом мало добавить задачу, еще нужно удалить конкретную, поменять, что-то вроде круда только для кронтаба нужно сделать. Затык в том, что то, что должно выполняться доступно из под sudo crontab -e, от обычного пользователя не работает. Системный скрипт такой, так как еще интеграция с реальным миром, по вызову апишки го будет реагировать оборудование которое описано системными скриптами(этакая апишка, чтоб что-то сделать надо вызвать определенный скрипт или же подредактировать/добавить/удалить задачу в кронтаб через судошку)
Основной затык, что нужно делать все от супер пользователя, я хотел бы этот крон вообще в отдельный сервис вынести да и все, просто ничего не могу дельного найти относительно именно запуска с судошкой
>>403439
С точки зрения памяти второй пизже, видел примерно подобные рассуждения в книге Таненбаума Операционные системы, где о параллелизме речь была, там петерсон еще то се
Я хз, я б так ответил, но моя компетентность слаба, просто пишу проект для кабанчика, разгербаю что там навалили до меня и привожу в порядок, такое
А зачем в общем и целом делать слип, если нужно что-то проверять, если есть sync.Cord? Слип локает горутину и мы не можем ничего делать n секунд. Есть инфа от знающих?
>Слип локает горутину
Горутина нужна только чтобы выполнить 1 единственное действие. Если она его не выполняет, то пусть спит
ну типа в ней данные могут какие-то быть (и скорее всего будут), к которым нужно обращаться будет, во время слипа хуй сосать можно тока и не обратиться к ним
пишешь консольную утилиту для редактирования
даешь юзеру который крутит апишку nopasswd на эту утилиту
Нихуя жавадебила прорвало от сырых sql.
>и генерятся не просто sql-файлики а файлы миграции, в которых также по возможности имеется опция даунгрейда
Даунгрейд тебе говнолиба не сможет гарантировать, так как его возможность зависит от структуры отдельной миграции. Так что даже даунгрейд нужно ручками писать, хотя если ты из этих, то можешь интерполировать в строчный литерал, лишь бы сырой sql не трогать.
>даунгрейд нужно ручками писать
Более чем в половине случаев - нет. Но когда нужно, этим можно озаботиться.
и да, даунгрейд делается тоже не через сырые запросы а через ORM
компилятор? /use/local у тебя в патхе? либо пофиксь патх, либо вызывай абсолютным путем
>Более чем в половине случаев - нет.
То есть почти в половине случаев всё равно ручками нужно писать.
>и да, даунгрейд делается тоже не через сырые запросы а через ORM
ORM будет занята n + 1 запросами, там не до миграций.
>>404674
Проблема в том, что питоновский образ тоже с патхом балуется:
https://github.com/docker-library/python/blob/b7c086e0d9ec53c7d7705f826efe2960d70b43e5/3.9/alpine3.16/Dockerfile#L10
https://github.com/docker-library/golang/blob/ad25ff18a6fcb732a2998c89424d00aa1acc2d31/1.18/alpine3.15/Dockerfile#L16
Я пробовал переобъявить патх как ENV PATH "/usr/local:usr/local/go/bin:$PATH", но не работает.
Ненавижу goвно, пишу на нём исключительно ради деняк. Соответственно, никаких петов на нём.
Как убрать этот прямоугольник? Бо пиздец глаза режет, я даже тему менял, ничего не помогает, или как откатиться от обновления ?
хз че за прямоугольник. удали кеш/перезапусти без экстенжнов. если ты после обновления не все окна закрыл, то перезапусти все окна.
>ORM будет занята n + 1 запросами
Ебало гобляди, всерьез считающей что в ормках до сих пор ее не научились решать, представили?
Волшебные ОРМки знают по доступу к полю объекта, что надо делать fetchOne()/fetchMany() или fetchAny(), ага. Типичный мирок с ООП головного мозга.
Короче накостылил решение, которое по сути компилятор копирует из альпиновского образа и ставит нужные переменные в конечном образе:
https://gist.github.com/GabenGar/6540465da34a36feb80600c2e9ebaca2
Это я все делал. Удалось пофиксить только откатом вс кода на более старую версию, джсончик с настройками удалял, явно дело не в них. Не обновляйтесь с 1.69 пацаны, не рекомендую
Я просто хз, есть ли универсальная IDE от жидбрайнсов? Мне надо на пистоне писать, открывать юпитер ноутбуки, го, js , java желательно еще плюсы
Спасибо
https://fasterthanli.me/articles/i-want-off-mr-golangs-wild-ride
Как же гоблядей попускают
https://github.com/avito-tech/adv-backend-trainee-assignment
Собственно возникли следующие вопросы:
1) Стоит ли тут следовать DDD/Clean Arch. или проверяющие сочтут за карго-культиста, на такую задачу CA разводить и плодить директории?
2) Сортировка + Пагинация. Какие должны быть интерфейсы для получения данных из базы? Насколько целесообразно реализовывать на сыром SQL? Выглядет ебовато. Как реализовать без ORM?
Просто делай мвс круд. Sql можешь в хранимые процедуры вынести(выколивать их из кода)
>МВС круд
Понимания, что такое MVC на бэкенде, да еще и с JSON API еще меньше. Я пока вонаби. Надо бы погуглить.
Спасибо!
>выколивать их из кода
Вот пока не могу придумать, как назвать функции.
Пока на ум приходит что-то типа этого, но выглядит всрато.
GetOrderByDate(context, descending bool, limit int, offset int) []Entity
GetOrderByPrice(context, descending bool, limit int, offset int) []Entity
limit и offset для пагинации.
CREATE TABLE IF NOT EXISTS advertisements(
id SERIAL PRIMARY KEY,
title VARCHAR(200),
price DECIMAL(15, 2),
description VARCHAR(1000),
photo_1 TEXT,
photo_2 TEXT,
photo_3 TEXT,
);
А если они упорядочены, добавить колонку с приоритетом?
Нет конечно же, для этого отдельную таблицу выделяют с сылкой на ключ основной таблицы.
мы бы возможно запихнули их в jsonb поле. в отдельную табличку должно быть тоже норм.
>>408131
тут похоже что колонку сортировки нужно передавать параметром, там же только одно слово после order by меняется в запросе.
>>408086
достаточно должно быть обычных репа+сервис+ручки+модельки без ДДД ебатории.
sql по классике у нас билдится руками в сервисе, часто даже без всяких squirrel. ормов тут ещё не видел.
Вообще чтобы понять основную идею отображения горутин на потоки необходимо первым делом снизойти на уровень системных вызовов операционной системы.
Вызовы бывают синхронные по типу (здесь перечислены функции на языке Си по UNIX-стандарту, аналогичные есть на винде) read, write, create, dup, dup2 и так далее. Синхронные они в том смысле, что основной поток исполнения блокируется до тех пор, пока эти функции не вернут результат. Допустим, ты читаешь файл и read "усыпит" твою программу, до тех пор пока не прочитается нужное количество байт.
Более гибкая, но запутывающая альтернатива -- это асинхронные вызовы по типу aio_read, aio_write. Их основная суть в том, что ты прокручиваешь цикл для выяснения происходящих событий - запись завершена, чтение завершено и т.д. При этом твоя программа не блокируется. В основном цикле ты можешь работать с разными вызовами и событиями
Как итог: горутины размазываются по тредам.
Когда тред определяет, что в горутине происходит асинхронный вызов, то он отправляет его на асинхронное исполнение и цепляет другую свободную горутину. При этом отдельным потоком (если я не ошибаюсь) запускается net poller который узнает статусы исполнения горутин. Если асинхронное исполнение завершено, то он возвращает горутину на поток обратно. Тоже самое неверно для синхронных вызовов. Если горутина использует синхронный вызов, то она никуда не отправляется и по сути пожирает один тред
тред проще не перекатывать чем перекатывать
>запихнули их в jsonb поле
Так реляционка же? Если да, то тут нарушение нормальной формы, не
>тут похоже что колонку сортировки нужно передавать параметром, там же только одно слово после order by меняется в запросе.
И правда, спасибо!
>Сейчас вб при подаче к ним на стажку просит вертеть деревья и решать задачи уровня яндекса на собесах.
Это правда?
Это везде так, даже на фронте от макак требуют верчения деревьев.
ПЕРЕКАТ https://2ch.hk/pr/res/2409760.html (М)
ПЕРЕКАТ https://2ch.hk/pr/res/2409760.html (М)
>Так реляционка же? Если да, то тут нарушение нормальной формы, не
в тестовом может это и интересно, что ты знаешь джойны и как нормализовать БД (в комменте вполне можно обосновать почему ты решил денормализовать), но ИРЛ никому нахуй не нужна нормальная форма, если она не дает никакой выгоды и из-за неё приходится усложнять запросы агрегатными функциями/джойнами/дополнительными запросами. если у картинок нихуя нет дополнительных свойств, у тебя появляется какая-то странная колонка для порядка картинок, которую хз как обновлять при добавлении/удалении картинки из середины, и тебе нахуй не никогда не нужно будет картинки выбирать отдельно от объявления, то мне кажется это валидный кейс для денормализации.
Это копия, сохраненная 5 августа 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.