Вы видите копию треда, сохраненную 24 марта 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
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 и даже живой
Предыдущий тред умирает здесь: >>1986204
>Небольшой канал треда: t.me/golang2ch и даже живой
Он слишком живой. Если его читать (тем более участвовать), кто там куда съездил, кто чё купил, кто какую хуйню сделал - на работу времени не останется.
Эксепшены антипродуктивны, смотри тридцатилетний срач в джаве насчет их checked exception
В итоге unchecked победили и используются повсеместно, а легаси с checked ловят и оборачивают в unchecked. В других языках, где есть эксепшены, нет unchecked вообще.
Господа двачеры-прогроммачеры. Я новичок в Go, так что просьба не кидаться говном
Задача следующая: я пишу скрипт, который будет записывать в файл ответы ссылки URL 404, 400, 200, 306 и т.д.
Пытаюсь это решить через file.WriteString("\nCodeResponse{status=%d}", code)
Но получаю предупреждение too many arguments in call to file.WriteString. Собственно где я мудак? Я знаю, что везде
WriteString() принимает ровно один аргумент - строку, форматировать он не умеет, делай это через fmt.Sprintf().
пасиба
Всем пис.
Кто ищет волшебника - получает сказочника, вот и все
Через другие языки. То же касается и ноды. Работаешь 1-2 года на пайтоне/пхп/джаве/шарпе, параллельно качаешь го, после года работы параллельно работе ищешь работу на го. Либо тех. вышку имеешь и вкатываешься легчайше в любой стек, хоть в хаскель.
Как я "напишу" тебе новый оператор в языке, в котором нельзя создавать новые операторы, еблан ты тупорылый? Говна поешь, макака безмозглая.
Это троллинг тупостью или тупость?
Короче, есть этот ваш пакаж, назовем его api, в нем есть файл, представим, что называется он testoviykal.go.
Вопрос: можно ли внутри текущего (api) пакажа заалиасить конкретно этот файл?
а-ля import test "api/testoviykal"
на отдельные файлы ссылаться нельзя, гошка работает с пакетами, а пакет - это все файлики в папке.
хз что ты хочешь вообще. либо уноси файл в отдельный пакет, либо наворачивай все функции из файла как методы на структе, либо юзай билд теги/суффиксы платформы, чтобы при билде выбрать файл.
Можно, но инфраструктура сырая.
Го это не про десктоп от слова совсем. Забудь про гуи на го.
можно, fyne или wails тебе в помощь
я больше охуеваю от того как в жс файлики по одному импортят, когда во фронт коммичу
GOMEMLIMIT поставь и сри байтами?
Да.
Что вообще от джуна-стажера го щас требуют? На текущей работе сетевик, по фану написал CRM для внутреннего пользования. JWT аутентификация, рест апи, асинхронные задачи типа отправки на печать, почты, етц. Сойдет за пет прожект чтобы к резюме прикладывать?
Хуй знает че еще такого надо уметь, может архитектуру/паттерны надрочить, или с grpc че нить сделать
Почему не сделали конструкторы для классов структур?
Почему не сделали встроенный set?
Язык на первый взгляд кажется очень простой и прямой палкой как си, но при это не дает тебе нихуя сделать
> Почему не сделали конструкторы для классов структур?
Потому что Go - не объектно-ориентированный язык. а что-то вроде высокоуровневой сишки.
> Почему не сделали встроенный set?
До определённого времени не было дженериков, и предлагалось использовать map. А теперь хуй кто будет вводить кейворд set, сразу всё легаси перестанет компилироваться, слишком уж популярное имя для идентификаторов.
>а что-то вроде высокоуровневой сишки
Ну ниудобна жи! С комфортом бизнес-логику не поделать так же как на пистоне или жабе. Есть примеры классических приложений (не инструментов) с открытым кодом? Хотя бы что-то вроде магазина или борды.
> С комфортом бизнес-логику не поделать так же как на пистоне или жабе
А здесь любят страдать, срут глобальными переменными, пишут велосипеды и кодогенераторы для добавления сахара, а большие приложения здесь писать очень больно, поэтому микросервисы здесь не столько современный подход, сколько вынужденная мера.
> Хотя бы что-то вроде магазина или борды
Ими весь гитхаб завален. Например, https://github.com/DexterHaslem/dexchan
Пару лет назад задался тем же вопросом по поводу сетов, тоже перекатывался с питона.
Сейчас уже не понимаю, зачем нужен условный сет/хип/кью в стд либе, при желании реализуется за 5 мин, а нужно раз в месяц.
Нашел на гитхабе кучку простых примеров, но ничего не запускается.
Я понимаю, что есть современный способ, когда через go mod init создаешь файлики, go mod get качаешь все что нужно, но
можно без этой ебли?
Я просто хочу пару примеров погонять, а не устраиваться в Wildberries.
Вот прочитал про GO111MODULE=off
Ну ладно, делаю это. Немного лучше поведение. Но пакетов все равно нет.
как тогда глобально поставить некоторые пакеты?
Можно использовать gopath. Но вообще go-модули - это и есть вариант без ебли + это единственный верный способ организации программ на го. Подход с gopath сейчас используется только в легаси
В чем проблема проинициализировать модуль и просто устанавливать зависимости, которые будут отображаться в файлике списком? В чем ебля-то?
Ладна, спасибо за нихуя.
вот что нужно делать :
export GO111MODULE=auto
go get github.com/google/бырбыр/мырмыр
go run хуйтика.go
>Сейчас уже не понимаю, зачем нужен условный сет/хип/кью в стд либе, при желании реализуется за 5 мин, а нужно раз в месяц.
То есть мне надо из проекта в проект таскать свой пакет с коллекциями, как диды которые с микрухой ебуться?
в рил ворлд проектах это не нужно. ну ладно раз в 3 месяца будет у вас новый сервис заводиться и с шансом 90% там даже очередь не нужна будет, а если ты будешь 2N в N оптимизировать затаскивая недефолтные коллекции тебя отхуесосят на ревью
>а если ты будешь 2N в N оптимизировать затаскивая недефолтные коллекции тебя отхуесосят на ревью
Так разве го не для этого нужен, что бы байты быстро педалить?
В Go есть поддержка сторонних либ, ничего своего таскать не надо. Устанавливаешь готовую либу, где реализованы десятки коллекций на все случаи жизни, и можешь писать почти как на нормальном языке.
Так я тоже, лол. Но литкод это не сфера применения гошки.
Это наша проблема, что мы решаем литкод на гошке.
Быть говнокодером? Не зря эти слова так похожи.
Как это сделать на Go? Go я выбираю исключительно ради легковесности горутин и логики эмуляции.
Изображать я буду обмен по TCP. Но не неплохо бы еще SNMP.
Может быть docker-драйвер слабать?
Или TAP-устройство?
Какие библиотеки или полуготовые проекты посмотреть?
Я смотреть google gvisor - оче сложно для меня и ничего не готово.
Я смотрел google packet - там нет tcp-стека полностью. Можно только пассивно наблюдать за трафиковм
Расскажите как вы живете без перегрузки методов?
про хуевую обработку ошибок и только недавно добавленные дженерики промолчу...
Пишем типы в названиях функций.
Дженерики лучше чем в жабе, кстати.
про этот пережиток плюсов раза два вспоминал за 3 года, несмотря на это всеми силами стараюсь не отчаиваться
exec /app/main: exec format error), подозреваю надо билдить как-то по хитрому, это при попытке закинуть в контейнер бинарник сбилженный под макос(юникс)
> В обязательном порядке проходим Go Tour: https://tour.golang.org/welcome/1 (есть на Русском)
я конечно знаю ангельский, но немного НЕПРИЯТНА
Охуеть, даже на польском есть версия, хотя в Польше вакансии не для сильных мидлов-сениоров просто нет. Зачем они делали ее я не знаю
капчю из Польски
блядь.
где еще можно найти документацию на docker кроме как на сайте docker.com ?
https://docs.docker.com/build/building/multi-stage/
Ей богу, как дети..
Почему у вас считается нормальным импорт модулей для сайд эффектов? Читаю доку по gRPC, что бы подключить сжатие на стороне сервера нужно импортировать gzip и никуда не указавать его дальше. Хотя бы при инициализации сервера через опции можно было бы сделать.
мы все против такого
Any это же алиас для пустого интерфейса
Ты должен вернуть тот же тип что будет указан в дженерике, но ты возвращаешь string. Прдеставь что у тебя тип дженерика будет int как туда можно впихнуть в строку?
any означает что тип дженерика может быть любым, а не то что он возвращает любой тип
В твоем примере никак, а так тебе нужно сделать интерфейс в котором есть метод который возвращает string
Вот хорошая статья на эту тему https://habr.com/ru/company/karuna/blog/552944/
для релокейта за границу наверн
Как на Go написать identity function? Это функция, которая возвращает свой аргумент. При чем аргументом может быть любой тип, в том числе функция. На JS это выглядит так
const identity = (x) => x;
Типизация Go требует указания типов аргумента и возвращаемого значения. Есть какие то хаки чтобы это обойти, чтобы функция принимала аргумент любого типа и возвращала его?
Спасибо за пример. Только не понял зачем 2 функции, identity и identity_interface? Как это называется T, чтобы почитать? Гуглится плохо. Я пока нуб в Go, хотел только понять как можно добиться параметрического полиморфизма.
Одна функция через дженерики, другая через интерфейс, T в квадратных скобках это дженерик
И identity и identity_interface могут принимать например функцию square. Так зачем их две, в чем разница?
Понял. Спасибо еще раз!
Вариант с интерфейсом более верный, потому что дженерик порождает разные функции на каждый тип
Короче, изучаю этот ваш Goи столкнулся с одной проблемой
Создал две структуры и две функции. Соответственно функцию main и другую, функцию, которая выполняет запись в строку, при выполнении определённых действий.
В функции main задал ключи-значения структурам.
Собственно две проблемы:
1) Вне функции main я не могу использовать WriteStting(), гугул говорит, что это из-за того, что WriteString() работает в функции, которая имеет права записи. Как дать права записи второй функции?
2) Если нельзя сделать первое, то как мне передать из одной локальной переменной значение в переменную, которая находится в другой функции?
Где почитать про ебучую T? Что это такое вообще? Не гуглится в доках.
Лучше по производительности? Где такие нюансы можно изучить? Читать доки или есть какие то другие ресурсы?
>ты про дженерики как я понял
Ну похоже это про дженерики. Только почему нигде нет описание что это есть? Это тип данных или что это?
>Базовый тип, от которого наследуются все остальные.
Где нибудь об этом пишут? Дай пожалуйста ссылку, а то выебся искать. Не гуглится T, не гуглится базовый тип. Где ты об этом читал?
> Почему не сделали конструкторы
чтобы не возникало вопросов как из конструктора вернуть ошибку
Надо запилить конструкторы. Тогда разрабы Go будут вынуждены добавить исключения.
доброе утро, сэры
Аноны, опишите свою работу. Чем вы конкретно занимаетесь на работе (понятным языком). С какими проблемами сталкиваетесь? И КАКИЕ ТЕХНОЛОГИИ ВЫ ПОСТОЯННО ИСПОЛЬЗУЕТЕ?
Нубля, онон. Расскажи за свою профу на местах? Я могу конечно ютуб открыть и глянуть там прогеров, но меня интересуют такие же двачеры.
Это просто букова, буковы любые можно ставить, хоть T, хоть K, хоть Ѫ, все работать будет
да просто вопрос уровня "где можно прочитать что такое x в математике?"
T это тупа принятое название для первого/единственного типа-параметра. пост про "базовый тип" это шутка про джаву (я надеюсь). если тебе нужно внятное описание, то можешь спек читать https://go.dev/ref/spec#Type_parameter_declarations всё остальное, включая сами сорсы гошки, это просто пережеванный разными людьми и выплюнутый в определенной физической форме спек
Ну наконец внятный ответ. Только я не догнал, как буквенный идентификатор выступает в качестве типа возвращаемого значения? Спасибо
в гошке это и так можно было сделать, например объявить произвольный алиас для типа type T = int и возвращать T вместо int.
чисто синтактически типы-параметры примерно похоже себя ведут. если на пальцах об асфальт, то можешь это рассматривать как алиас в скоупе функции, но конкретный тип, который алиасится, определяется при инстанциации.
я к тому, что вот это всё ведет себя одинаково
>Можно объявлять пользовательские типы?
да, в го можно объявлять пользовательские типы. это выгодно отличает го от языков, где это нельзя делать
>Так type all = any можно
да
Хуйня, а не язык. Даже на православном JS можно ML пилить, а это какое-то кустарное поделие для узких задач.
>можно ML пилить
ML - это язык программирования. Родоначальник целого семейства языков и множества фич. Python своим синтаксисом обязан языку ML. Поэтому пиши Machine Learning.
>Даже на православном JS можно ML пилить
И как это вообще относится к языку? Можно подумать JS поддерживает machine learning из stdlib. Запилят либы для Go и на нем можно будет юзать machine learning.
>это какое-то кустарное поделие для узких задач
Не кустарнее JS и PHP, но да, для узких задач, сети и конкурентность.
>>524211
>Чем вы конкретно занимаетесь на работе (понятным языком)
микросервисы... ну грубо говоря есть два вида задач - технические и продуктовые.
продуктовые это уровня
- есть шина данных (например какой-то топик в kafka или NATS) и сервис, который умеет отправлять пуши пользователям. нужно запилить сервис, который будет слушать шину и при получении определенных событий ходить в rpc ручку сервиса пушей, чтобы отправить эти пуши. а еще нужно запилить дедупликацию с БД/редисом, чтобы одинаковый пуш дважды не отправить. плюс возможно после получения события надо сначала идти в какие-то другие сервисы, чтобы взять нужную инфу для пуша.
- или нужно начать отдавать какие-то данные на фронт, т.к. мы хотим пользователям больше инфы показывать, например граф движения посылки. для этого нужно в сервис с апишкой допилить поход в сервис статусов за этой инфой.
- или так как у нас SSR, то всякие правки текстов тоже на бэкендеров падают.
и технические задачи - это уровня оптимизировать запрос в БД или запилить новую ручку для Х, которая возвращает меньше инфы, но работает быстрее, дергает более легкие ручки других сервисов или вообще не дергает, и переключить потребителей на неё, чтобы подготовиться к росту нагрузки на следующие полгода.
вместе со этим нужно мониторить и дежурить по сервисам своей команды.
>С какими проблемами сталкиваетесь?
- нужно получить данные из другого сервиса, но он не может выдержать нагрузку, которая планируется. там ручка не батчовая/нихуя не оптимизирована/гоняет сложный запрос в БД
- другая команда начала ходить в наш сервис со сложными фильтрами, и наша БД сдохла из-за отсутствия нужного индекса для такого фильтра
- нужно сделать фичу в сервисе другой команды. приходится в их код погружаться и договариваться о том, как ты это сделаешь
- нужно сделать фичу, которая требует еще нетривиальных правок на фронте, а в команде нет фронтендеров
>И КАКИЕ ТЕХНОЛОГИИ ВЫ ПОСТОЯННО ИСПОЛЬЗУЕТЕ?
инструменты - вскод, golangci-lint, gofumpt, mockgen
платформа - docker, minikube. на всех моих работках как минимум CI был в докере.
ну и в каждом первом сервисе постгрес есть. иногда еще редис в добавок, или монга вместо пг.
и очевидно баш: ты делаешь новый сервис, пишешь юнит-тесты, мигрируешь нужные для старта данные в БД, примерно прикинул РТ и нагрузку, но у тебя нихуя нет пруфов по приблизительным RT/SR, которые сервис будет реально выдавать. с башем можно тупо за 10 минут написать скрипт, который для каждой реальной строчки из БД дернет твою ручку, чтобы хоть какую-нибудь статистику собрать и понять насколько ты обосрался
>>524211
>Чем вы конкретно занимаетесь на работе (понятным языком)
микросервисы... ну грубо говоря есть два вида задач - технические и продуктовые.
продуктовые это уровня
- есть шина данных (например какой-то топик в kafka или NATS) и сервис, который умеет отправлять пуши пользователям. нужно запилить сервис, который будет слушать шину и при получении определенных событий ходить в rpc ручку сервиса пушей, чтобы отправить эти пуши. а еще нужно запилить дедупликацию с БД/редисом, чтобы одинаковый пуш дважды не отправить. плюс возможно после получения события надо сначала идти в какие-то другие сервисы, чтобы взять нужную инфу для пуша.
- или нужно начать отдавать какие-то данные на фронт, т.к. мы хотим пользователям больше инфы показывать, например граф движения посылки. для этого нужно в сервис с апишкой допилить поход в сервис статусов за этой инфой.
- или так как у нас SSR, то всякие правки текстов тоже на бэкендеров падают.
и технические задачи - это уровня оптимизировать запрос в БД или запилить новую ручку для Х, которая возвращает меньше инфы, но работает быстрее, дергает более легкие ручки других сервисов или вообще не дергает, и переключить потребителей на неё, чтобы подготовиться к росту нагрузки на следующие полгода.
вместе со этим нужно мониторить и дежурить по сервисам своей команды.
>С какими проблемами сталкиваетесь?
- нужно получить данные из другого сервиса, но он не может выдержать нагрузку, которая планируется. там ручка не батчовая/нихуя не оптимизирована/гоняет сложный запрос в БД
- другая команда начала ходить в наш сервис со сложными фильтрами, и наша БД сдохла из-за отсутствия нужного индекса для такого фильтра
- нужно сделать фичу в сервисе другой команды. приходится в их код погружаться и договариваться о том, как ты это сделаешь
- нужно сделать фичу, которая требует еще нетривиальных правок на фронте, а в команде нет фронтендеров
>И КАКИЕ ТЕХНОЛОГИИ ВЫ ПОСТОЯННО ИСПОЛЬЗУЕТЕ?
инструменты - вскод, golangci-lint, gofumpt, mockgen
платформа - docker, minikube. на всех моих работках как минимум CI был в докере.
ну и в каждом первом сервисе постгрес есть. иногда еще редис в добавок, или монга вместо пг.
и очевидно баш: ты делаешь новый сервис, пишешь юнит-тесты, мигрируешь нужные для старта данные в БД, примерно прикинул РТ и нагрузку, но у тебя нихуя нет пруфов по приблизительным RT/SR, которые сервис будет реально выдавать. с башем можно тупо за 10 минут написать скрипт, который для каждой реальной строчки из БД дернет твою ручку, чтобы хоть какую-нибудь статистику собрать и понять насколько ты обосрался
Сап, goвнач.
Работаю с голангом полгода на проде.
У нас типо хайлоад и микросервисы, всё деплоится в AWS через docker-compose. Довольно большое и запутанное приложение, но дёргается через POST метод и там дохуища логики внутри.
Есть ещё приложение на гошке, там всего три эндпоинта, которые лезут в другую базу и возвращают результат для мобильного API, написано с GORM, по-сути, там простые круды.
Ну и в чём вопрос. А нормальные компании как испрользуют голанг? Что сейчас вообще делают на гошке? Мне кажется, наши ебантяи неправильно используют говноланг.
Почему я спрашиваю? Да меня подзаебал проект, я бы куда-нибудь перешёл и уволился. Но не знаю чем сейчас go живёт, что на нём востребовано. Зарплата очень низкая, на любом другом языке в разы больше платят
Вот есть
> var symbol int32 = 'c'
> fmt.Println(string(symbol))
Значит symbol преобразовывается:
'c' as int32 -> 99 as int32 -> string(99 as int32) -> 'c'
?
Тупой вопрос, но я правильно понимаю что на вход в string подается два значения - число и его тип? А далее так как это метод строки - он выдает строку изходя из своих таблиц?
У тебя string() преобразовал в тип данных без изменения содержимого памяти
юзай strconv.Itoa(i)
>ML - это язык программирования. Родоначальник целого семейства языков и множества фич. Python своим синтаксисом обязан языку ML. Поэтому пиши Machine Learning.
Я его прекрасно понял, контекста достаточно. Выражение "делать ML" уже стопроцентно говорит, что речь не о ЯП.
>Зарплата очень низкая, на любом другом языке в разы больше платят
Да ну нахуй, статистика говорит об обратном.
мимо
>на вход в string подается два значения - число и его тип
когда компилятор видит, что ты передаешь rune в string(), он впихивает конверсию к utf-8 репрезентации.
>А далее так как это метод строки - он выдает строку изходя из своих таблиц
но тут нет ни одного вызова метода. и у строк методов никаких нет
Это чушь. JS и Python - лучшие языки, чтобы заработать первый миллион. А по голангу почти нет вакансий
Не пойму откуда он мой последний launch.json запоминает . Он просто совсем в другом каталоге валяется
Такая хуйня нерепрезентабельна, нужно показывать облачко с количеством вакух и количество опыта. На говяхе джунов и недомидлов практически нет, как и на элексире.
так ты создал go.mod или нет?
Это реально пачка файлов с package main, где все имена пересекаются (то есть, наиболее удобный способ поиграться с мелкими примерами) ?
Всё так, новые проекты на говне больше не пишут. В России и подавно
создаешь лонч.жсон, ставишь курсор в configurations и нажимаешь контролспейс и Launch file даже в подсказках есть
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch file",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${file}"
}
]
}
файлики так
.vscode/launch.json
1.go
2.go
go.mod
так, вроде я разобрался:
launch.json действительно позволяет отлаживать без хуйни.
но вот go.mod ты зря создал. зря.
ДЖСОНОМЕШАЛКА МЕШАЕТ ДЖСОН
@
БРИГАДА РАЗРАБОВ ЖРЁТ САМОГОН
@
ТИМЛИД ОЛОЛОЕВ В ДОСКУ ПЬЯН
@
НАПЕЧАТАЛ ОН DROP DATABASE
@
ФРОНТЕНДЕР СТЕПАН ENTER НАЖАЛ
@
НАХУЙ ВЕСЬ ПРОД ПОТЁРЛИ РАЗОМ
@
БРИГАДА РАЗРАБОВ ЖРЁТ САМОГОН
@
В ДЖСОНОМЕШАЛКЕ КРОВАВЫЙ РАСТВОР
@
ТЕСТО С МЯСОМ ХОРОШО
@
ЗДЕСЬ УЖЕ ПЕРЕМЕШАЛОСЬ
@
ЭТИ ВКУСНЫМ ПИРОГОМ
@
ВСЕ КЛИЕНТЫ ОБЪЕДАЛИСЬ
@
ДЖСОНОМЕШАЛКА - АЛКОГОЛИЗМ
@
ДЖСОНОМЕШАЛКА - КАНИБАЛИЗМ
ДЖСОНОМЕШАЛКА МЕШАЕТ ДЖСОН
@
БРИГАДА РАЗРАБОВ ЖРЁТ САМОГОН
@
ТИМЛИД ОЛОЛОЕВ В ДОСКУ ПЬЯН
@
НАПЕЧАТАЛ ОН DROP DATABASE
@
ФРОНТЕНДЕР СТЕПАН ENTER НАЖАЛ
@
НАХУЙ ВЕСЬ ПРОД ПОТЁРЛИ РАЗОМ
@
БРИГАДА РАЗРАБОВ ЖРЁТ САМОГОН
@
В ДЖСОНОМЕШАЛКЕ КРОВАВЫЙ РАСТВОР
@
ТЕСТО С МЯСОМ ХОРОШО
@
ЗДЕСЬ УЖЕ ПЕРЕМЕШАЛОСЬ
@
ЭТИ ВКУСНЫМ ПИРОГОМ
@
ВСЕ КЛИЕНТЫ ОБЪЕДАЛИСЬ
@
ДЖСОНОМЕШАЛКА - АЛКОГОЛИЗМ
@
ДЖСОНОМЕШАЛКА - КАНИБАЛИЗМ
Но ведь джейсономешалка у гошки не самая лучшая. особенно с Indent
Это реальность. Медианная зп на питоне в рф равна 140 тысяч рублей.
>А по голангу почти нет вакансий
Как и конкурентов. В питоне соотношение вакансии/конкуренты гораздо хуже (у питона оно в принципе самое хуёвое, хуже может быть разве что у жс). Ты откуда вылез вообще, я не верю что человек хоть какое-то отношение к рынку айти имеющий может такую дичь писать.
>Ты откуда вылез вообще
Я два года писал на Python, потом три года на JS, сейчас вот полгода на golang работаю в коммерческой компании.
По инсайду, golang уже мёртв и нет смысла продолжать его учить
>По инсайду, golang уже мёртв и нет смысла продолжать его учить
Как ruby или еще не так сильно умер?
Ruby это чисто американская фишка, и он вполне ещё живой.
А golang это хайповый высер google, который нигде, кроме google и не нужен. Всё, что я читаю о "популярности голанга" это мирф от инфоцыганов. По скорости golang уступает даже C#.
Прумиронк.
>>524961
>>525020
Толсто. Go и Ruby не отличаются по зарплате. А вакансий для Go в РФ больше в 3 раза. И Go не игрушка, а промышленный язык программирования. Пошел бы ты играть в свою песочницу.
https://survey.stackoverflow.co/2022/
>По скорости golang уступает даже C#
fasthttp довольно быстрый.
Кстати говоря, techempower тесты для шарпа оказались хитрой подделкой, а не тестами фреймворка, поэтому тот факт, что asp.net входит в топ-10 по производительности, оказался не более чем маркетинговым буллщитом
я думаю тут каждый делает вывод для себя сам хочет ли он писать на шарпе в ланите или на гошке в озоне.
Возможно даже лахта серит
Верим.
я думаю тут каждый делает вывод для себя сам хочет ли он писать на шарпе в тинькофф или на гошке в вайлдберис (:
в тинькофф пишут на го) в вб куча легаси на шарпе) делай выводы чмоха
>тинек
>вайлдбериз
Вы тут корпоративными рабами хотите стать? Сильнее сотрудников в жопу ябут только в каком нибудь сималенде
Это тим лид такое себе позволяет? Почему еще не отпиздили? Накинули бы на него покрывало и повыбивали бы дурь.
Тинек больше про скалу+джаву. Но гошка там тоже есть. И шарп тоже.
что-то нихуя не работает с этими либами на Си.
В обычном случае все хорошо. И вроде из vscode проект работает.
devcontaiers не использую - очень сложна там наверчено все. У меня тут просто свои приколюхи с root и libpcap
Так там социоблядство к языку не имеющее никакого отношения
Закономерно, разрабы на зумерском языке в основном социобляди и на токсичном дваче им не уютно. Страшно представить, что в чатах по JS и петухону происходит, раз они даже здесь срут 100500 постов в день.
На токсичном дваче неуютно из-за лахтоботов, модерации от сотрудников псевдочастной компании VK и товарищей майоров, которые захаживают и в тематику
РФ уже объявило тотальную войну голенгу и физически истребляет последователей?
Там филиал двача
юзаем на проде Echo, полёт нормальнй
Не поработал с аналогами? Это как вообще? Путь разработки на Go такой: вкатываешься в другой язык, дорастаешь там до миддла, учишь синтаксис Go и вкатываешься, если обнаружил местный велосипедный фреймворк, используешь его, иначе пишешь свой.
Да, я почти синиор на своём родном языке. Боюсь вкатываться к go, потому что жёсткие собесы и не выше 120к
Есть у меня один микросервис на ноде, который кафку читает, решил я его переписать на го по приколу. Кафка защищена сертами. Переношу рабочие серты в pem формате и ловлю ошибку.
certificate, err := tls.X509KeyPair([]byte(certPEM), []byte(keyPEM))
tls: failed to parse private key
Что не так с этой хуйней?
Ничего не знаю, мы тесты написали и тесты проходят.
попробуй тут примеры взять и понять чем твой код отличается от эталонного
https://github.com/golang/go/blob/master/src/crypto/tls/tls_test.go
Дядя, я скопировал base64 с тем же самым рабочим ключом, раскодировал в байты и сунул в tls. Код ничем не отличается.
Единственное, ключ начинается вот так:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: BLA-BLA,228E5FE1488BCC00
0g154X8u8c2c2a8b3A22....
А ключи в примерах Proc-Type и DEK-info не содержат. ЧЗХ?
хз. с дебагером пройдись
Объясните пожалуйста, почему последний элемент никогда не читается горутиной?
Знаю, что это всратое использование каналов, я в данном примере просто надрачиваюсь.
Уже разобрался. close тут не при чем, до него даже не доходит. Главная горутина завершает работу сразу после помещения последнего элемента в канал - логично, что программа закрывается и дочерняя горутина не успевает.
Почем вычиткиу? В главной горутине мы пишем в канал, а не читаем. Когда читать нечего, главная горутина завершает работу.
По-моему ты хуйню написал.
Но хотел написать примерно это :
https://play.golang.com/p/WuCAEpogAQQ
И close тут причем.
> По-моему ты хуйню написал.
Все так. Я только учу язык и специально в рамках изучения смотрел, что будет, если писать в канал из главной горутины.
А причем тут close конкретно в моем примере, я не понял. Если мы пишем в канал в дочерней горутине, то ясно, что без нее программа не завершится. Если говорить про изначальный пример, то он там не оказывает никакого влияния на работу если я правильно понимаю.
канал же без буфера. главная горутина блочится на отправке до того как придет читатель из канала. когда приходит читатель, значение копируется напрямую со стека отправляющей горутины в стек читающей. в сам канал значение не помещается.
взять ос.аргс и проверить длину
Я тут понял, что мне тоже следует разобраться с подобной же херней.
Есть простая утилита, которая должна останавливаться по ctrl-c или по юникс-сигналу.
Я делаю на все доступные каналы close, но потоки не всегда успевают корректно завершиться.
Прочитал на stack overflow, что все используют sync.Waitgroup.
Но это по-моему как-то некрасиво выглядит.
как следует спроектировать работу с каналами в моем случае?
Надо прочитать строку задом наперед. Объясните 2 вариант решения, я не понимаю его.
А все остальные используют x/sync/errgroup
Ну, код не расскажу, а принцип такой. Берётся вторая строка, сначала пустая, потом берём из первой строки по одной букве и добавляем СЛЕВА в первую строку.
Например строка "двач"
Берётся первая буква "д", добавляется слева к строке "", получается "д".
Берётся вторая буква "в", добавляется слева к строке "д", получается "вд".
Берётся третья буква "а", добавляется слева к строке "вд", получается "авд".
Берётся четвёртая буква "ч", добавляется слева к строке "авд", получается "чавд".
В общих чертах так.
Ебануться, то есть в этом языке не придумали split() reverse() и join()?
Вот такую хуету нужно будет писать каждый раз чтоб перевернуть строчку в реальном сервисе?
Ты у меня спрашиваешь? Я го не знаю, я тебе просто алгоритм объяснил, потому что ты сказал, что ты его не понял.
Я даже не знаю, про что статья по ссылке, я только код читал, может там как раз и описывается реализация reverse из их стандартной библиотеки или что-то такое.
невермайнд
>Go является маяком стабильности
Напомните сколько времени прошло после того как после неотключаемой сборки мусора которая фризила бэкенде и все разрабы послали нахуй это язык прошло времени прежде чем разрабы языка очухались и сделали её отключаемой?
Мне что, писать тест с unbuffered channels ?
да, спасибо.
Но это не скрытый пример. Это на stackoverflow есть.
Эта нейронка ведь не сама продуцирует, а гуглит?
строго говоря, код НЕ простой.
Я думал в пакете testing есть какие-нибудь хуитки для детекта дедлоков и тд.
Проблема в том, что юнит-тесты, кажется, сосредоточены на логике предметной области, а все вопросы обеспечивает фреймворк.
Тестировать сами каналы и отвечают ли вовремя функции никому не надо.
ну пусть напишет то, чего нет.
Вот этот код надо было найти ей https://stackoverflow.com/questions/24929790/how-to-set-the-go-timeout-flag-on-go-test
Пох на дебичей, которую всякую хуйню просят
https://github.com/kamranahmedse/developer-roadmap
Вот родмапы свежие
https://roadmap.sh/golang
Но нах они нужны?
Я блядь должен 10 скриптов теперь встраивать в vscode ?
а как У ВАС В КОМПАНИИ? Линтер хотя бы запускаете для разнообразия?
точнее, я хотел спросить:
много ли кода использовано с легальным использованием shadowing ?
Возможно, бросаться ставить линтер в CI идея дурацкая и неспроста в golangci-lint не поддерживается нигде
>>535361
нихуя не понял. golangci-lint давно умеет шедовинг проверять с помощью настройки go vet
linters-settings:
govet:
check-shadowing: true
>Возможно, бросаться ставить линтер в CI идея дурацкая
нихуя не понял. иметь линтер в CI это базовая вещь
>неспроста в golangci-lint не поддерживается нигде
нихуя не понял. не поддерживается что? где?
>а как У ВАС В КОМПАНИИ? Линтер хотя бы запускаете для разнообразия?
golangci-lint гоняется для всех гошных проектов с небольшой пачкой линтеров. команды по желанию могут расширить набор конфигом
>много ли кода использовано с легальным использованием shadowing ?
а нужно ли изъебываться и креативить с названиями для err
>нихуя не понял. golangci-lint давно умеет шедовинг проверять с помощью настройки go vet
Несмотря на настройку, это не работает. Именно об этом в книжке написано. Я попробовал.
Линтер, который он рекомендует в книжке, справляется.
>а нужно ли изъебываться и креативить с названиями для err
Но ведь это почти единственное применение затенения?
>golangci-lint гоняется для всех гошных проектов с небольшой пачкой линтеров
Ага! А с какой именно?
Там сейчас есть дефолтные, но интересно как у людей
возможно, я вчера был уставший и не правильно разобрался с go vet shadow.
Вроде бы сегодня все работает.
Соответственно, мне не нужно запускать несколько линтеров и у меня не бонбит
вот есть:
func () {
//код 1
go func() {
//код 2
}
// код 3
}
// код 4
код 2 НЕ предшествует коду 3 ?
А выполнится ли код 4 точно после кода 2 ?
где в описании языка об этом явно написано?
То есть, если я выполняю подсчет вызовов горутин через waitGroup, нужно ли мне каждом горутинном блоке дополнительно waitGroup.Add и waitGroup.Done ?
>go func уходит в стек вызовов
что эта фраза значит? какое явление описывает? Полностью на тарабарском.
В общем, я решил просто написать тестовую программу и выяснил что вообще ничего не понимаю в Go.
https://go.dev/play/p/ideka61QwER
Как правильно должна выглядеть работа с waitGroup в этом случае?
у нас errcheck gosimple govet ineffassign staticcheck typecheck unused
В этом примере все по фен-шую?
https://go.dev/play/p/pB2KEw_46Qo
Конечно, в такой простой логике не следовало бы использовать sync.waitGroup, однако мне неизвестно реальное количество обработчиков к тому моменту, как программа решит остановиться. Их будет чуть больше чем создано каналов и поэтому я использую waitGroup.
Но как тут принято делать?
2 выполнится после 1, но нет никаких гарантий относительно 3 и 4.
>>536266
wg.Done желательно чтобы было видно там же, где происходит wg.Add. а также лучше wg.Done засунуть в деферы. если опустить глобальную вг и то, что processor завершается раньше тасок (мб с реальным кодом это и будет логично, но в примере кажется, что они могли бы отслеживаться вложенной вейтгруппой, которая создается в processor), то на минималках по феншую это примерно так https://go.dev/play/p/wvvh0AnEviN
ok. спасибо.
>Но в примере кажется, что они могли бы отслеживаться вложенной вейтгруппой, которая создается в processor)
Кстати, так и сделал.
А зачем ты вызываешь функцию processor не как горутину, а через анонимную горутину? В чем тут феншуй?
wg.Add(1)
go func() {
defer wg.Done()
это феншуй
а
wg.Done()
...
...
...
...
...
...
...
...
...
...
...
wg.Add(1)
go f()
это такое себе
Хороший у вас тред. Как правило, я за 3-5 так или иначе прихожу к тому же ответу, что будет напечатан.
Ладно. И что не так с поддержкой докера в vscode?
Почему в шаблонном проекте не отладочного файла?
Я прям устал с этим compose. Пока не очень работает, но судя по примете, я экспериментальным образом подберу параметры к понедельнику и все заработает.
Нг может есть готовый шаблон?
В общем я все починиль.
в VSCode какая-то засада с докером, если он НЕ питон и НЕ нода и НЕ Сишарп.
Единственное, что можно делать - docker compose up (причем нельзя делать посервисное поднятие).
После этого можно делать debug with remote connection.
У меня теперь другая засада : почему-то delve всегда пытается собрать новый бинарник под видом __debug_bin, а у меня в контейнере даже сети нет (так уж надо, в этом суть программы)
Что не так с delve? Как тут собирать бинарник под delve ?
сцуко, я тупанул.
dlv debug собирает, а dlv exec запускает.
Все работает, но могу придумать как и сеть отключить и отладчик оставить работать.
мне всего пару литров надо для CI
Докладываю, бро:
Все очень плохо.
Из-за ебучей системы сборки, Go не знает какой код на самом деле нужно компилить. Информации в файле go.mod недостаточно, ведь есть непрямые импорты. а go.sum используется только для проверки.
В блоге самого Докер, чувак предлагает подцеплять специальный том для кеширования. https://www.docker.com/blog/containerize-your-go-developer-environment-part-2/
В принципи, работает, я немного разочарован.
var err error
var val ✡error
var ierr any = err
var ival any = val
fmt.Println(ierr == nil)
fmt.Println(ival == nil)
const (
host = "localhost"
port = 5432
user = "postgres"
password = "postgres"
dbname = "todos"
)
connStr := fmt.Sprintf("host=%s port=%d user=%s "+
"password=%s dbname=%s sslmode=disable",
host, port, user, password, dbname)
db, err := sql.Open("postgres", connStr)
if err != nil {
log.Fatal(err)
}
Вылезает то, что на пике.
1)Почему вылезают символы?
2) Как исправить ошибку? Установил postgres на ПК, создал базу todos через pgadmin4(через неё заходит в базу).
Правь pg_hba.conf
>1)Почему вылезают символы?
Несколько вариантов
- ты бывший 1с-ник.
- ты поставил postgres на венду вместо того чтобы ставить из docker
>2) Как исправить ошибку? Установил postgres на ПК, создал базу todos через pgadmin4(через неё заходит в базу).
Для начала разобраться с текстом. Если перенаправить вывод в файл, то его потом можно раскодировать
Процедурщина. В лучших традициях дедов с сишкой.
Если да, то зачем и почему?
Нет смысла переходить, Java до сих пор лучший язык современности. Быстрый и резкий.
Его хейт ТОЛЬКО в сторону тяжёлых фреймворков и индусов.
Смысл? Лучше на scala или хотя бы kotlin какой-нить перекатиться, а там можно жить уже.
> ООП это не про синтаксис
Так-то да, но в контексте какого-то языка всегда имеются в виду средства для ООП в этом языке. То есть классы, объекты, инкапсуляция, наследование, полиморфизм и другое говно.
>ООП это не про синтаксис. Это парадигма. ООП код вполне можно писать на C.
Это понятно, но писать ооп-лапшу с джаве и писать ооп-лашку в 1с это очень разный экспириенс. Во втором случае у тебя всё наследование и инкапсуляция держаться будет на иоглашениях.
Gin точно хуита. Если попадётся - то это легаси 100%
Почему?
Gin.
В РФ много вакансий уже. Вроде тот же хх, авито, сбермаркет, wildberries, Aviasales, ozon на голанге пишут. Некоторые даже свитчеров с Java/C# начали нанимать. Кстати, что интересно, походу только через свитчинг вкат и осуществим в голанг, для джунов вакансий нет, лол.
Просто я немного заебался с корпоративной тягомотины в банке на java, хотя так то мне java/spring стек очень нравиться. Хотя, понятное дело, это больше от проекта зависит, но всё же.
Еще пугает, пишут, что го говнокод зашкаливает, так как у вас там ООП нет и нормально применить всякие популярные паттерны невозможно.
>походу только через свитчинг вкат и осуществим в голанг
Недавно кидали вакансию с Яндекса, условием которой был свитчинг на Го, лол.
>так как у вас там ООП нет и нормально применить всякие популярные паттерны невозможно
Это только для тех, кто не понимает сии паттерны.
>Это только для тех, кто не понимает сии паттерны.
Что за паттерны такие? Ты имеешь в виду паттерны C-языка что ли?
Это множественная форма от слова сей.
>нормально применить всякие популярные паттерны невозможно.
Да ты и сам гавнокодер.
С современном айти паттерны не нужны никому, кроме индусам
>В РФ много вакансий уже.
Не для меня вакансии эти висят. Мне нужны Европейские вакансии. На голанге где-то пишут, кроме легаси-контор в РФ?
Паттерны появятся, как только индусы ломанутся получать свои 10 долларов в час, гавнокодя на нём для количества строчек
> более сложные обработки строк
define
>как тут люди пользуются regex
Как в любом другом языке - строго по назначению: структурированные тексты небольшого размера
(грепать логи слишком дорого)
> так как у вас там ООП нет и нормально применить всякие популярные паттерны невозможно.
Некоторые невозможно, но большинство можно написать, тут нет классического ООП. Да и с другой стороны в чем суть писать всякие паттерны? Никогда не понимал почему джависты срут фабриками
ZalupaFactory zalupaFactory = new Zalupafactory();
ZalupaInAss zalupaInAss = zalupaFactory.getZalupa("inAss");
Вместо
ZalupaInAss zalupaInAss = new ZalupaInAss();
И такое по всему коду, если упадет стектрейс читать невозможно, нахуя весь этот лишний говнокод?
Поискал как подобное сделать на го и увидел, что самый популярный варинат это через каналы, что мне кажется не совсем чистым, так как требует запуска отдельной горутины (то есть фактически дополнительного треда и средства для его синхронизации). Можно ли как-то альтернативно это реализовать?
Что-то ты не то нагуглил, родной.
Я предполагаю как ты размышлял:
листы - итераторы - чем заменить итераторы в Го.
Не пытайся изображать итераторы там где их нет.
Ебош по Кнуту. Структурки, там, указателюшки, if then.
>нахуя весь этот лишний говнокод?
>How can an object be created so that subclasses can redefine which class to instantiate?
>How can a class defer instantiation to subclasses?
>>How can an object be created so that subclasses can redefine which class to instantiate?
>>How can a class defer instantiation to subclasses?
А зачем это нужно? Я не спрашиваю как создавать подклассы, я спрашиваю нахуя оно нужно? И почему кроме джавистов никто такой хуйней не страдает?
орунах
Ну вот обычный, который по массивам, слайсам и мапкам бегает, вполне себе итератор.
Вынеси range в переменную и дёргай методы итетаров руками
но yield ведь нету.
Там наверняка можно что-то накрутить через reflect, но это будет трюк, а не идиома языка
Чел, не демотивируй меня плс. Бекендеры решают серьёзные задачи, по сравнению с нами фротомакаками. Да и бекенд по универсальнее и шире же должен быть, соприкасается с другими специалистами намного чаще чем фронтенд.
Только не жсоны, а протобафы, но это можно и на питоне делать.
> Бекендеры решают серьёзные задачи
Да, с серьёзным видом отгружают жсоны.
Хорошо там, где нас нет.
>но yield ведь нету.
Я кажется понял в чем наше недопонимание
Вопрос в том, действительно ли мы не можем создать свой итератор типа range, потому что создали языка просто скрыли аналог yield внутри компилятора и могут его юзать, но не дают это делать пользователю?
yield не скрыли. его просто никогда не было.
тот range, который ты считаешь за аналог итерирующего range в python, это range, который умеет итерироваться по срезам и map.
И больше ничего.
Нет никаких итераторов в Go.
Макака путает итераторы и генераторы, причем их конкретную имплементацию с yield. Забей на него.
Мимо
https://dmkpress.com/catalog/computer/programming/978-5-93700-140-5/
Книга рассказывает о том, как разрабатывать уникальные языки программирования, чтобы сократить время и стоимость создания приложений для новых или специализированных областей применения вычислительной техники. Вы начнете с реализации интерфейса компилятора для вашего языка, включая лексический и синтаксический анализатор, а к концу чтения сможете разрабатывать и воплощать в коде свои собственные языки, позволяющие компилировать и запускать любые программы.
Издание предназначено для разработчиков программного обеспечения, заинтересованных в разработке собственного языка программирования или адаптации существующего языка для той или иной предметной области. Студентам, изучающим информатику, книга пригодится как практическое руководство по разработке языка.
Для изучения материала понадобятся базовые знания и опыт работы с языком высокого уровня, таким как Java или C++.
Че донести хотел?
Этот вопрос со времен Dragon Book (1977) закрыт.
Ну гошники могли еще у K&P (Керниган и Пайк, это немного другая книга, но тоже хорошая) ознакомиться с lex и yacc
ты вообще что написал? Я не просил исправить код. Я просил показать как надо использовать итераторы в Go.
Я не вижу тут ни аналога yield(), ни аналога __next__()
Если можно, поделитесь книжкой пожалуйста.
На голенге почти нет вакух для ждунов, на пистоне что бы вкатится нужно пробиться через тысячу таких же вкатывальщиков, выбирай.
Ты спросил в Go-треде, но не в тредах про питон и пхп, значит, выбор ты уже сделал.
Хотя хуй в бэк вкатишься через Go, здесь одни миддлы перекатываются из бэка на других языках.
Да, потому что пхп вызывает отторжение, в питон сложно вкатиться, я думал в го есть хотя бы относительный кадровый дефицит.
В Go нет кадрового дефицита, это язык для тех, кто знает, чего хочет, а не чтобы массово клепать бизнес-логику, как во всяких джавашарпах, где вечный дефицит кадров.
Джава говно уровня пхп, не хочу. Цшарп уже лучше, но всё равно хочу что то новое. Го так плох для вката?
Попробуй C++.
В Go тесты - антипаттерн.
большой вопрос что именно называть "интеграционными" ?
Библиотеку со специальным названием подсказать? Я не знаю.
github actions запускается прямо на ubuntu с установленным docker.
И что тебе еще нужно, хороняка?
у нас делается так: поднимается сервис и БД, соседние сервисы мокаются через ховерфлай. отдельный тестовый бинарь кидает запросы в поднятый сервис.
ну и нужно подумать надо ли оно тебе. мб тебе интеграционных тупо на репу хватит, а ручки можно юнитами протестить.
структурно вроде норм, так и должно выглядеть, разве што респонс не проверяется. единственные вопросы такие
- не видно как завершается app (t.Cleanup есть?)
- непонятно зачем t.Error с return, когда есть t.Fatal
- string(body) с %s можно не делать
подаваться есть смысл всегда. что тебе херочка сделает? приедет и разобьет ебало?
>Интеграционные и юнит тесты довольно логичное разделение.
ето да.
но как отделить интеграционные от дымовых и функциональных?
должен ли ты написать кучу разных mock-объектов или достаточно въебать какой-нибудь конфиг в docker имитирующий бд и батник с тестами?
И вообще, раз это интеграционный тест, то лучше просто поднять в коде веб-сервер, благо в 2022 с этим проблем.
классификация тестов - настолько неоднозначная и сложная штука, что нормальные компании на нее забили.
и вот что они предлагают:
>маленькие тесты выполняются в одном
процессе, средние тесты — на одной машине, а большие тесты могут охватывать
столько машин и процессов, сколько понадобится
ЮТакая классификация, в отличие от более традиционного деления на «юнит-тесты»
или «интеграционные тесты», была выбрана, потому что для нас важнее такие
качества теста, как скорость выполнения и детерминированность независимо от
широты охвата тестирования. Маленькие тесты с любой широтой охвата за счет
ограничений, наложенных на них, почти всегда быстрее и более детерминированы,
чем тесты, вовлекающие в работу обширную инфраструктуру или потребляющие
больше ресурсов. С увеличением размеров тестов многие ограничения ослабляются.
Средние тесты обладают большей гибкостью, но они недостаточно детерминированы.
Большие тесты сохраняются только для самых сложных и комплексных сценариев
тестирования.
Годный пост, продвину в своей галере такую классификацию
Все равно не ясно.
Давай на примере. Анон пишет некий ссылкосокращатель.
Как бы выглядел интеграционный тест и чем он отличался бы от функционального?
Интеграционный должен использовать мок-класс , а функциональный мок-вебсервис?
Стало только хуже. Ты мемасы локальной конторы выдаешь за суть индустрии.
Вот одна из твоих ссылок сообщает:
>The difference is that an integration test may simply verify that you can query the database while a functional test would expect to get a specific value from the database as defined by the product requirements.
Ну вроде понятно, но смущает что все по-разному пишут
>Мне больше нравится классификация от softwaretestinghelp, там вообще логичнее все. В рот их короче ебал
но там вообще нельзя отделить Функциональный от Интеграционного.
У них функциональность как отдельный признак.
Еще большая хуйня.
Хотел повыпендриваться знаниями? Так приходи подготовленным... на конференцию со звездами
486x848, 0:05
написали ахуительную функцию stop, а пояснить не поянили
// The stop function can be called
// multiple times safely.
stop := func() {
select {
case closing<-struct{}{}:
<-closed
case <-closed:
}
}
Ок, послали closing<-struct{}{} первый раз, это понятно.
Нахуя сразу же блокироваться на <-closed?
Если мы положили в не буферизированый канал closing<-struct{}{}, то он заблокируется и пре остальных случаях вызова stop мы будем сразу прееходить в ветку case <-closed и ждать пока канал closed закроют?
Аналогично этому мы блокируемся сразу после closing<-struct{}{}, чтобы первый вызов <-closed тоже заблокировался по аналогии с последующими вызовами stop?
Правильное рассуждение для чего нужен этот ебаный цырк? Эта ебка нужна, чтобы тот кто вызывает stop не упал с паникой потомучто канал закрыт, а просто блокировался?
> go101.org
хуй знает с чего ты решил что это хороший сайт.
Вот хороший сайт:
Язык_программирования_Go_2016Керниган.pdf
978544611885_Go__идиомы_и_паттерны.pdf
Чтобы горутина завершилась при close пиши в ней :
for elem := range channel {
fmt.Println(elem)
}
Ну вроде там все написано. Берем пример 4:
>Sometimes, it is needed that the close signal must be made by a third-party goroutine. For such cases, we can use an extra signal channel to notify the sender to close the data channel.
Но я не понял твой вопрос и с чего ты взял что там неблокирующийся канал использован? Это обычная техника.
Есть ситуации когда переменная-канал просто недоступна и какая-то горутина захочет все равно остановить или подать сигнал внутрь. В этом случае читают с помощью select из двух каналов сразу. struct {}{} используют как канал, но без конкретных данных.
Описание говорит we can use an extra signal channel to notify the sender to close the data channel.
А как нихуя не пояснили, просто высрали код.
>читают с помощью select из двух каналов сразу.
case closing<-struct{}{}:
Это же запись в канал идет, а не чтение,можно понять хотя бы метом исключения, потомучто по коду больне никто не пишет в closing.
Вопрос конкретный, какого хуя происходит в коде
stop := func() {
select {
case closing<-struct{}{}:
<-closed
case <-closed:
}
}
почему он должен останавливать сендер и почему его можно вызывать много раз?
как-то сложно наворотили, но я вижу что каналов два и как бы два статуса "сейчас closing" и "уже closed".
сами себе подают сигнал что ВСЕ.
Как и твоя пунктуация.
Ваши прогнозы на 2023й год?
Будет ли говноланг где-то востребован, кроме русских банков?
Есть PL/SQL и немного делфи и вижуалбейсика для клиентов.
Ну вот как раз голанг ВНЕЗАПНО заходит в русские банки
Почитай вакансии голанга - там будет про то, что "переходим/переписываем на голанг"
да хз че рассказать еще, я не особо дохуя интересного делал. можеш вопросы задать
так еще маркетплейсы/классифайды же есть. ну и в крипте тоже вроде применяют. ну т.е. всё что загребание бабла
>>557476
>>558520
Сейчас почти все МЯСО (кроме банков) в большинстве случаев пишет весь новый бекенд именно на го, насколько я слышу от своих одногруппников, которые там работают. Сам таким образом случайно вкатился го стажером в сентябре, хотя изучал долгое время жабу и спринг. Просто HR сказала, что команды с джавой стажеров себе не ищут, а вот те, что на го пишут, часто ищут себе стажеров в последнее время, ну я и согласился пройти собес просто ради интереса.
И там где я работаю, все старье с питухона/С++/иногда жабы/etc переписывают на го.
>>545434
>походу только через свитчинг вкат и осуществим в голанг, для джунов вакансий нет, лол
А крупняк почти не нанимает джунов, они нанимают стажеров, из которых потом делают джунов.
Так вот вб, авито, озон стажеров точно нанимают на го, лично знаю стажеров (или уже джунов) из этих мест.
>>544570
>scala
Скала кажется скорее метрва, чем жива. Самое крупнейшее сообщество скалистов в РФ - Тинькофф, и те начали от скалы уходить.
да, умеет, нашёл. ну и подставить goos goarch свои значения
GOOS=linux GOARCH=amd64 go build -o linux_amd64
А по поводу RUST?
Блять, как же вы заебали выёбываться на шапку, ну перекатывайте сами, раз такте умные.
Никто не выёбывался, я реально нихуя не понял что имелось в виду, там какой-то конкретный раздел, просто по-другому называется или подразумевается что страничка документации это и есть "Learning Go"?
Английский язык это первый язык, что изучает программист
Только доки и читаю всегда. Вопрос был что имелось в виду в шапке. Мне в общем-то похуй, что на него ответят, просто любопытно
Сам я воннаби свитчер из пхп.
Надо по хорошему ебануть пет уровня очередного блядь говнокруда ебаного которые я в рот ебал: туду лист, 100 любимых фильмов и т.п.
Но у меня такое лютое полшестого при одной мысли, что я буду БЕСПЛАТНО делать хуйню, которой уже не первый год занимаюсь за деньги.
Хуй привстаёт только на идеи оффлайновых консольных приложух - архиватора, простенькой субд (особенно на это).
Тут писали, мол го это про круды, значит пиши круды или работодатель покрутит пальцем у виска. Но это такой мрак. Поддержите что-ль и скажите, что субд тоже норм, или подкиньте идей хоть для самую малость интересного круда. Ну а с меня нефть.
Докер, кубер, прометеус, консул и много чего ещё написаны на го и никто у виска не крутит. Пиши чё по кайфу. Единственное: но го не принято писать приложухи, которым нужна предсказуемая latency, потому что GC. Так что СУБД всё-таки мимо, хотя в академических целях чему бы и нет.
никакому нормальному челику не будет интересно твой пет/кофешоп листать. это что-то вроде лаб из универа, тысячная вариация одной и той же хуиты на гитхабе каждого второго индуса/китайца. ты уверен, что хочешь идти работать на людей, которым это интерсно?
>подкиньте идей хоть для самую малость интересного круда
>ты уверен, что хочешь идти работать на людей, которым это интерсно?
Хороший вопрос. А что, вопрос в хайринге разрабов на гоху не стоит таким образом, что люди без пета автоматически идут нахуй?
Я просто не в курсе реалий гошного рынка, а петов никогда не писал именно с целью показывать при найме, все мои петы сделаны для себя на языках, на которых я вряд ли буду когда-то работать (хотя чем чёрт не шутит, мой самый жирный - это мод для майнкрафта)
да. он насильно не убивает горутины и даже стак не разматывает. функции сами решают обрабатывать ли отмену контекста и как.
Все так.
Спасибо!
Можешь дёрнуть курсы Otus с торрентов, мне такое особо не нужно, т.к. много воды и я не новичок, чтобы так мне всё разжёвывали, но тебе может и пойдёт
https://pastebin.com/fFyjSjJB
Ну и go-tour с твоей вводной можешь даже не открывать - он для людей, знакомых с другими языками.
Было
https://2ch.hk/pr/arch/2022-11-09/res/2409760.html (М)
>Не слушай этого мудака, какой ещё нахуй n-body simulator, на тебя там все как на идиота посмотрят и спросят, ебанутый ты или да а ты и да, не рассказывать же на собесе, что послушался совета на двачах.
Го это на 99% язык для системных и околосетевых приблуд, докеров, сервисов, веб-сервисов, банкинга, недо-бд и так далее и тому подобное.
Поэтому для начала сделай простенький веб-бэкенд, чтобы получать запросики и сохранять их в бд и обратно. Хотя бы.
Потом попробуй поверх какую-нибудь бизнес-логику накрутить, например написать сервис-сокращатель ссылок, а лучше что-нибудь с фоновой работой
>язык для системных и околосетевых приблуд, докеров, сервисов, веб-сервисов, банкинга, недо-бд и так далее и тому подобное.
Соответственно, если ты ни в чем не разбираешься, как типичный кодерок, писать тебе вообще нечего.
Нет никакого смысла.
Нет идеи.
Нет движущей силы.
Нет пет-проекта.
>>язык для системных и околосетевых приблуд, докеров, сервисов, веб-сервисов, банкинга, недо-бд и так далее и тому подобное.
>Соответственно
>для начала сделай простенький веб-бэкенд, чтобы получать запросики и сохранять их в бд и обратно.
С - системность
а до конца мы не дочитываем, выхватываем только то что нам удобно?
Такая напыщенность, а когда задают вопрос "чем конкретно занимаешься":
>>524359
продуктовые это уровня
- есть шина данных (например какой-то топик в kafka или NATS) и сервис, который умеет отправлять пуши пользователям. нужно запилить сервис, который будет слушать шину и при получении определенных событий ходить в rpc ручку сервиса пушей, чтобы отправить эти пуши. а еще нужно запилить дедупликацию с БД/редисом, чтобы одинаковый пуш дважды не отправить. плюс возможно после получения события надо сначала идти в какие-то другие сервисы, чтобы взять нужную инфу для пуша.
- или нужно начать отдавать какие-то данные на фронт, т.к. мы хотим пользователям больше инфы показывать, например граф движения посылки. для этого нужно в сервис с апишкой допилить поход в сервис статусов за этой инфой.
Эм, это как-то не похоже на системное программирование и на отсутствие задач для бекендера типичного кодерка, который ни в чём не разбирается, не находишь?
Я просто имел ввиду, что для вкатыша не может существовать пет-проекта на Go.
Пет-проект должен приносить радость. Нужно с ним нянчиться как с Pet.
Хорошо, если ты админчик или увлеченный хакер.
Но вкатышь из php не может им быть.
Кстати, кафки эти ваши, тоже какое-то бесполезное говно созданные потому что в больших корпорациях а) не знают что делать с данными, но знают что за их удаление их не простят
б) не могут договориться как их обрабатывать и поэтому делают шину.
То есть, это все непостижимо выходцу из мира обычных приложений.
>>для начала сделай простенький веб-бэкенд, чтобы получать запросики и сохранять их в бд и обратно.
с какой целью? в чем удовольствие ?
Пет-проект должен приносить радость с первых дней существования
Вкатывайтесь!
Тут, правда, ОПЯТЬ нужно понимать проблематику, а лучше быть админчиком сетей доступа в Многострадальной Россиюшке.
Свой движок СУБД писать интересно, но боюсь что очень долго, да и без подготовки имхо тяжеловато будет.
Я вообще никаких петов на го в свое время не писал, просто сказал на собеседовании, что прошел го тур (но при этом был опыт на другом языке), в итоге взяли. А вообще лучше ковырять что-то уже существующее в опенсорсе, а не писать свои велосипеды, пользы больше будет + прокачаешь навык чтения кода.
>Тестов наделать например
Дебсы все еще верят в то что написать хороший тест не в десять раз сложнее чем написать говнокод который он должен тестировать.
Также дебсы продолжают писать assert 1+1==2 и думают что это несет хоть какую то пользу хоть кому то.
Ну так можно рогалик сделать, и похую кто там чё итт скажет по поводу можно ли использовать го для этих целей или нет. А действия мобов в многопотоке обрабатывать
> прокачаешь навык чтения кода
Я как-то не замечал раньше, чтоб чтение кода было каким-то отдельным навыком, хз. Но совет про чтение опенсорса всё равно понял и принял.
Да, но не совсем понятно откуда эти данные берутся.
Кажется, не везде стоят ТСПУ и кое-где есть самодельные блокировщики. Эту инфу сливают и этот тип делает какого-то бота.
Почему на Go - не ведаю.
Еще он автор доклада "Почему Golang такой странненький".Просто ему нравится писать.
что такое горутины, как они шедулятся, чем обработка неблокирующих сисколов отличается от блокирующих, как гц работает, как подобрать таймаут на сетевой запрос, че там в пакете sync и как работает, ну дохуя классических вопросов в общем
>>562930
про кубер пара вопросов есть, но чисто как бонус. из тулзов нужно знать ппроф/трейс, чем моки можно генерить. уметь sql писать, уметь пользоваться индексами. ну и уметь пользоваться каким-нибудь месседж брокером, а то иначе странно. плюс знать что такое метрики и нахуя (это к слову как таймаут подбирается) и такое
спасибо, а то хочу свичнуться из ts бэка на го, и хочется быть готовым ко всему на собесе
постижимо, если тебя наняли упругим студентом и ты там 2 года поебался с кафками за (небольшие) деньги.
Пользу фрилансеру или мамкиному борщехлебу кафки принести не могут. Если ты пытаешься это изучать бесплатно, то мотивации не будет.
Нет, непостижимо. Выше говорили, что таким надо родиться. Ты либо рождаешься гофером, либо не рождаешься им, третьего не дано.
Хороший вопрос
Лично я вкатился на гошку, когда пришёл на проект, в котором был golang
Просто начал решать таски по нему
вакансий на джуна в принципе нет
Вообщем нет, но cs база мб полезной также некоторые крупные компании типа IBM смотрят на это и существуют различные программы иммиграции с балльно рейтинговой системой канада / австралия, если тебя это интересует
Го это немного специфичный язык, на который как правило переписывают уже устоявшиеся копролиты на других языках (зачастую php). Поэтому чисто гошных вакансий мало, зато дофига вакансий PHP+Go, Java+Go, и так далее.
А особенно сейчас, когда многие конторы релоцировались и с рынком вакансий черте что происходит.
Тем более, что джуны никогда никому не были особо нужны, потому что джун в первый год-два это чистый убыток, мало того, что ему надо зарплату платить, так он ещё и отвлекает других разработчиков, которые иначе бы полезные дела делали.
>А особенно сейчас, когда многие конторы релоцировались и с рынком вакансий черте что происходит.
На гошке сейчас вакансий в России больше, чем в Европе
В целом ожидаемо, на го мне кажется условных сеньоро-миддлов больше, чем джунов и многие из них уехали, "закрыв" вакансии в ЕС и "открыв" их в РФ.
Тем более сейчас очередной финансовый кризис, медвежий рынок, вот это всё.
Но вот что будет в будущем, в том числе краткосрочном, и не закроют ли найм в россии - непонятно. Я разные прогнозы встречал.
Он обкурился сишкой, где тоже любят из функций возвращать коды ошибок. Хотя уже тогда там были setjmp/longjmp, используемые некоторыми для эмуляции эксепшенов.
Из плюсов возврата ошибки в сравнении с ексепшенами:
1) Проще делать всякую около-ошибочную логику, вроде retry-ев всяких backoff, circuit breaker, etc
2) Асинхронщина. В общем случае не ясно когда завершиться (к|г)орутина, и тем более не ясно catch-ить её эксепшен в другом условном потоке
3) Производитльность. Стек трейс штука не бесплатная, в ряде случаев еще и бесполезная например когда разработчик ожидает конкретный эксепшен и делает что-то вместо логирования
Из минусов очевидное:
Но 99% случаев это да, замусоривание кода if err != nil { return nil, fmt.Errorf("do huina: %w", err) }
пайк ругался, если я получаю ошибку и не обрабатываю, причём не просто вконце функции, а непосредственно после вылезания ошибки, и сам потом мне говорил: вот я получаю ошибку и обрабатываю, и ты так делай!
Каждый дрочит как хочет, есть, например, json либа, где в случае чего - паника, а потом на верхнем уровне - recover и возвращается ошибка значением. В yaml тоже самое. В sql.Rows сохраняется ошибка в структуре, а в каждом методе структуры проверяется эта сохраненная ошибка, и в случае её наличия метод ничего не делает. Это самое близкое к тому что ты написал. Но там это нужно для другого, а твой вариант не решает проблему того что надо if err != nil писать, просто перемещает эту проверку внутрь вызываемых функций. + бонусом добавляет проблему, что когда ошибка попадет в логи будет не ясно из какой именно функции она пришла.
а как ты поймёшь, какой еррор был в итоге? Хуйня как по мне
вообще всё это дрочь, экспешны проще. Бесят адепты гошки, которые с вдохновленными лицами рассказывают, как ЕС удобнее
>экспешны проще
Это когда нормальные.
В 1с например есть эксепшены, но он такие всратые, что обычно видишь
>сохраняется ошибка в структуре, а в каждом методе структуры проверяется эта сохраненная ошибка, и в случае её наличия метод ничего не делает
Экскепшены тоже хуйня, потому что ломается вывод типов, неудобно чейнить код с ними, паттерн матчинг не заюзаешь, они требуют больше ресурсов при выбросе для раскрутки и так далее.
Лучше всего имхо это сделано в расте. Псевдокодом:
fun Foo() Result[int64] { // Result[T] = T || error
foo()? // ? - это сахар вокруг if err
bar()?.wrap("comment") // допишет в ошибку "comment" для трейсинга
switch b := baz() {
case error: обрабатываем b отдельно как ошибку, если очень надо
case specialError: обрабатываем b как специальный тип ошибки
case value: обрабатываем b как результат (если ошибки не было)
}
b := bazz()? // вернет ошибку, если b это ошибка иначе присвоит b значение
}
Отличный микс подходов. Компилятор генерирует эффективный код, ошибки видно в сигнатуре функций, легко резолвит нуллабилити, удобно для функциональщины, удобно для чейнинга, удобно обрабаывать ошибки и контекстуализировать их, не требует ни многострочных try(e) catch {throw e2(e)} на каждый пук.
Очень жаль, что гошники идеологически против синтаксического сахара, имхо, его тут немного, а код выглядит ну в разы симпатичнее.
----
Ну и если уж взялся рекламировать раст, отдельный ништяк это иммутабельные ссылки/указатели.
В го указали используются для нескольких вещей:
1) Передать указатель на что-то внутрь функции, чтобы поменять значение внутри, к пимеру функция sort(slice []T)
2) Сделать что-то опциональным/нуллабельным
3) Оптимизация лишних выделений памяти при копировании, которые произойдут, если начать большую структуру передавать в функции по значению
Хуйня в том, что не всегда понятно, зачем что-то передается по указателю в конкретном месте. Просто непонятно по сигнатуре функции, визибилити нет.
В расте же каждый из этих моментов реализуется по своему:
1) можно передать не sort(slice []T) а sort(slice mut []T) тогда сразу понятно, что это мутабельная хуйня и slice внутри функции будет изменяться
2) можно передать не sort(slice []T) а sort(slice immut []T) тогда сразу понятно, что это иммутабельная хуйня и указатель тут нужен для оптимизации передачи данных
3) можно передать не sort(slice []T) а sort(slice Optional<*[]T>) тогда сразу понятно, что slice опционален и его можно не передавать. Кстати, отдельным ништяком, Optional надо резолвить, доставая из него значение и поэтому nil pointer exception невозможен в принципе, ты не сможешь накосячить и попытаться разыменовать пустой указатель.
Короче имхо между Rust и Go потерялся идеальный язык. С гошной экосистемой, гошным рантаймом и прочими ништяками, но при этом с чуть большей свободой по работе с VM и памятью и разумным количеством сахара, чтобы не захламлять код обработкой ошибок, проверками на nil и прочим скамом из 80х
Экскепшены тоже хуйня, потому что ломается вывод типов, неудобно чейнить код с ними, паттерн матчинг не заюзаешь, они требуют больше ресурсов при выбросе для раскрутки и так далее.
Лучше всего имхо это сделано в расте. Псевдокодом:
fun Foo() Result[int64] { // Result[T] = T || error
foo()? // ? - это сахар вокруг if err
bar()?.wrap("comment") // допишет в ошибку "comment" для трейсинга
switch b := baz() {
case error: обрабатываем b отдельно как ошибку, если очень надо
case specialError: обрабатываем b как специальный тип ошибки
case value: обрабатываем b как результат (если ошибки не было)
}
b := bazz()? // вернет ошибку, если b это ошибка иначе присвоит b значение
}
Отличный микс подходов. Компилятор генерирует эффективный код, ошибки видно в сигнатуре функций, легко резолвит нуллабилити, удобно для функциональщины, удобно для чейнинга, удобно обрабаывать ошибки и контекстуализировать их, не требует ни многострочных try(e) catch {throw e2(e)} на каждый пук.
Очень жаль, что гошники идеологически против синтаксического сахара, имхо, его тут немного, а код выглядит ну в разы симпатичнее.
----
Ну и если уж взялся рекламировать раст, отдельный ништяк это иммутабельные ссылки/указатели.
В го указали используются для нескольких вещей:
1) Передать указатель на что-то внутрь функции, чтобы поменять значение внутри, к пимеру функция sort(slice []T)
2) Сделать что-то опциональным/нуллабельным
3) Оптимизация лишних выделений памяти при копировании, которые произойдут, если начать большую структуру передавать в функции по значению
Хуйня в том, что не всегда понятно, зачем что-то передается по указателю в конкретном месте. Просто непонятно по сигнатуре функции, визибилити нет.
В расте же каждый из этих моментов реализуется по своему:
1) можно передать не sort(slice []T) а sort(slice mut []T) тогда сразу понятно, что это мутабельная хуйня и slice внутри функции будет изменяться
2) можно передать не sort(slice []T) а sort(slice immut []T) тогда сразу понятно, что это иммутабельная хуйня и указатель тут нужен для оптимизации передачи данных
3) можно передать не sort(slice []T) а sort(slice Optional<*[]T>) тогда сразу понятно, что slice опционален и его можно не передавать. Кстати, отдельным ништяком, Optional надо резолвить, доставая из него значение и поэтому nil pointer exception невозможен в принципе, ты не сможешь накосячить и попытаться разыменовать пустой указатель.
Короче имхо между Rust и Go потерялся идеальный язык. С гошной экосистемой, гошным рантаймом и прочими ништяками, но при этом с чуть большей свободой по работе с VM и памятью и разумным количеством сахара, чтобы не захламлять код обработкой ошибок, проверками на nil и прочим скамом из 80х
А в твоём примере как поймёшь? Ты точно так же возвращаешь самую первую ошибку.
хз
В го в этом то и прикол, что ошибки контектуализируются:
if err := foo(); err != nil {return fmt.Errorf("FOO: %d %w", userID, err)}
if err := bar(); err != nil {return fmt.Errorf("BAR %d: %w", whoreID, err)}
if err := baz(); err != nil {return fmt.Errorf("BAZ %d: %w", motherID, err)}
В джаве же тупо кидается какой-нибудь NotFound эксепшен и всё, в него на айдишников не пишут, ничего. В лучшем случае запишут текстом в самом начале трейса, никто каждую строку в try catch не оборачивает и айдишники не дописывает.
В го же ты в итоге получишь прям контекстуализированное сообщение об ошибке:
cant exec scenario 221: can't load user 115: can't find object "dick": gay detected
А что не так в том, что я делаю интерфейс сторер-залупанейм и передать его, а не конкретную базейку, я самоучка посоветуйте книг по бекенду
Указатель не есть абстрация языка.
Это данный нам свыше механизм адресации http://assembler-code.com/ukazatel-v-programmirovanii/
это не для русского человека
Указатели в пщ мало чем отличаются от ссылок в нормальных языках, разве что больше закорючек писать.
Парни, ищу стажировку/позицию джуна, я адекватный чел, перекатился с питухона, есть универский бекграунд в области информатики, опыт коммерческой разработки - чуть больше года. Знаю/понимаю стек типичного микросервиса, в целом, если есть любой вариант писать коммерческий код на гошке, оставьте почту, я свяжусь.
Выбора нет, использую все каналы коммуникации. Даже двач, хули. Реальность 2к23
Ниже планки неинересности/желания терпеть инструмент, к тому же 0 перспектив для меня там где я живу про 1с никто не знает и уж тем более не использует(я не из РФ капчую)
Я подумал, лучше я почту оставлю
Ты не можешь "терпеть" то, о чём ничего не знаешь. Это как если бы я "терпел" паскаль.
На предыдущем месте Django/DRF/Ninja, Neo4j, GraphQL, Vue3, MSSQL+MySQL+MongoDB, немножечко Airflow и Nifi.
На текущем месте Flask, gRPC, Redis, PSQL, Gitlab, немножечко React и C# с MinIO
Держись за место пока можешь, я даже на питухон разраба ловлю реджекты, недавно пробовал податься, деньги заканчиваются.
Стек Flask, Django, DRF, Psql, Docker, ща стал видеть требования по JS и всяким Vue , React, походу теперь надо быть фуллстеком, нежели простым питухонистом
У меня есть накопления, и в принципе без работы с текущими тратами + инфляцией мне хватит на 2+ года, но коплю на свою отдельную недвигу, а прожирать это не хочется. На текущем месте меня вряд ли уволят в ближайшие 2-3 месяца, но у меня уже будет ровно год и я хочу просить прибавку через перформанс ревью, но боюсь его не пройду, т.к. мало чего за последнее время делаю и больше решаю мелкие баги/рефакторю проект, а не развиваюсь.
Хотел переписать grpc-ные сервисы на Go, но свежепришедший архитектор уже решил переписывать все сервисы на rest. А меня уже эти круды заебали.
Я знаю паскаль на уровне, на котором ты 1с. Нормальные люди этот уровень называют "ничего".
> Общая эрудиция позволяет сразу отказываться от того, что точно мне не интересно
Не интересно и "инструмент хуёвый" это два немножко разных понятия, если первое обосновывать действительно не надо, то второе - ещё как.
Я например не могу спиздануть, что паскаль - хуёвый язык, потому что меня сразу попросят обосновать и я жидко умру.
>переписать grpc-ные сервисы на Go, но свежепришедший архитектор уже решил переписывать все сервисы на rest
нахуя
Айти комьюнити сродни философам, лишь бы доебаться.
>неинересности/желания терпеть инструмент
Я не говорил что он хуевый, я сказал что у меня нет желания его терпеть, читай, нет желания на нем работать, я так давно мог стать Java QA и не ебать себе мозги с Го микросервисами и прочими вещами, мог вот буквально недавно стать Java Trainee , но после Go попытка написать ТУДУ на спринге вызвала у меня горение жопы, даже умолчу о том, что с Java у меня нет проблем, я писал на ней в универе, да и вкатывался с этого языка 3 года назад. Писать веб сервисы на таком я бы точно не хотел, потому что предвижу кол-0во проблем с этим инструментом, а так же , надо нести ответственность за сроки и реализацию, а с ним я этого делать не готов. Можно долго мусолить эту тему, но для меня не достаточно ПРОСТО ПИСАТЬ КОД, мне надо получать моральное удовольствие, чтобы на работу идти с горящими глазами, должна быть заинтересованность. Если ее нету то и результат априори хуевый(в моем случае). Мне не важно, хорошо это плохо. Это то что я прошел на личном опыте и никакие за-против этого уже не исправят
Ты рассказываешь про вещи, с которыми ты ИМЕЛ опыт, в качестве аргумента в разговоре о том, с чем ты его не имел, я правильно тебя понимаю? Мне тоже не нравится спринг и не нравится 1с, но между разница в том, что я действительно работал с обоими этими инструментами и могу аргументированно пояснить что и как.
Чебля? Просто подайся на вакансию разраба в яндексе/авито/озон/вайлдбериз. Там тебе предложат команды с го.
А по факту какая разница на чем писать? Главное, чтобы челы в команде были сильными разрабами, чтобы было у кого получиться. А язык это хуета по большей части.
Ну а как ты думаешь это происходит? Пришел чел, в жизни строчки кода не написал, 4 года работал в йоте, поднимал проект джавовый в роли архитектора, до этого работая кволити менеджером. Пришел в другую мобильную энтерпрайз-порашу, где люди пытались внедрить что-то новое, но ему лень разбираться, он с топами забухал и решил откатить всё на пару лет назад, ибо грпс это говно, а рест заебись.
>Не обязательно быть грузчиком чтобы не хотеть таскать мешки
Про "хотеть" речи не шло в третий раз. Речь шла про "утверждать объективную хуёвость"
Как эту парашу читать?
ты сам выдумываешь проблемы и сам до них цепляешься. Что ты от меня хочешь? Какой смысл в твоих ответах? Ты тратишь мое время и свое.
Я проблему обозначил достаточно чётко - если хочешь, чтобы тебя не трогали, не давай оценочных суждений в областях, в которых несведущ.
Если не хочешь тратить своё время - ну покажи для начала человека, который держит у твоего виска пистолет, заставляя его тратить.
Я только что дал тебе алгоритм решения обеих твоих проблем, дело за малым.
>Ознакомиться с документацией
В каком другом языке дженерики через квадратные скобки пишутся?
типикал айти специалист, У нас такой был, девопс. Тоже кукарекал про оценочные суждения, то ему не нравится, тут мы НЕ ДОСТАТОЧНО ОБЪЕКТИВНЫ, ВЫ НИ ШАРИТЕ Я ШАРЮ!. Вообще команду раздражал, долго не хотели выкидывать на мороз, терпели. Потом проект отвалился, западный заказчик был
Чел, зашейся, тебя это в той же мере касалось
Какая разница, что там в других языках? Если нужно узнать про дженерики в Go. читай документацию Go, а не других языков.
[] для массивов, а <> для дженериков. Это отличительная черта и не нужно мешать
Да ну не, хуёвая придирка. Ты почти никогда не спутаешь массив с дженериками, слишком разные контексты применения. А дальше уже всё зависит от того, на какие символы твои глаза натренировались смотреть.
То есть, наверное уголки были бы самую чуточку легче для восприятия (но опять же: самую-самую, это придирка одного уровня с придиркой к долларам в названиях переменных в php), но оно бы усложнило парсер. Сейчас у символов >< вполне определенный контекст в смысле парсера и поэтому добавление им дополнительной нагрузки добавило бы туда порядочно логики и, возможно, замедлило его. Где-то на гитхабе можно почитать срачи внутри го тим на эту тему.
ну представь что вызовы функций это лукап в map[type]func(...) или аналогично для типов как если бы были first-class типы
Так и я говорю, что во всех нормальных языках дженерики сделали уголками. Один косоёбный golang использует квадратные скобки.
Scala тоже использует квадратные. Ну и смотрим пикрил
да просто не проверяешь ошибку и всё. получаеш panic: runtime error: invalid memory address or nil pointer dereference и лежиш урчиш довольно
Ебать ты тупой)
Требуется не адвансед, а чтоб с нуля мне в голову правильно все вложили. Последовательно.
Я самоучка, все по верхам да по верхам.
А реально ли в Москве свичнуться хотя бы на джуна Go после многолетнего опыта написания драйверов на чистом C под специфическую ОС?
Или нужен именно опыт работы в бэкенде и мой опыт байтоёбства на C не поможет?
Если писал что-то сетевое, то потенциально можно приплести
Ты безусловно прав. К докам я прихожу изредка, но только когда какие-то проблемы.
А мне бы хотелось какой-то курс от дяди, который структурированно и постепенно все вложит в голову.
А через доки вот получаются такие как я самоучки с кашей в голове.
Дисклеймер - го фановый язык для меня, деньги зарабатываю на другом.
Проблемы такие:
1. Го сам по себе не настолько суперсложный язык, чтобы его рассусоливать
2. Он не оброс экосистемой, чтобы её рассусоливать
3. Он не так давно появился, чтобы к нему появились курсы
Посоветовать тут можно только работать точечно, если у тебя проблемы с системщиной - смотреть туда, в отрыве от языка, если с языком - читнуть книг и посмотреть репозитории с кучей звёзд. А других вариантов особо-то и нет.
Месседж понял, спасибо.
> 2. Он не оброс экосистемой, чтобы её рассусоливать
Экосистема есть и вполне себе неплохая. Просто подход другой, в го не приняты фреймворки и ты сам собираешь себе проект из маленьких либ, в отличие от php, где ты бахнул ларавел и всё.
Но все кирпичики уже написаны, спокойно берешь logrus, pgx, sqlboiler, goose, kafka-go и что там ещё тебе нужно - и погнали. Новичку чуть сложнее, так как он не знает, чего брать.
> 3. Он не так давно появился, чтобы к нему появились курсы
Я тут недавно пытался найти курсы для родственника, так вот: хороших курсов не существует в принципе. Все скиллбоксы, яндекс-практимумы и хекслеты - это примерно одинаковый трешняк. Поэтому нет и не надо, хочешь изучать - берешь и сам гуглишь статьи, мануалы, примеры и пытаешься повторить, ничего лучше ещё не придумали.
> Просто подход другой, в го не приняты фреймворки
Нипонел а как же джины и гормы? Хотя джин ещё непонятно корректно ли ОСТНАСТКОЙ называть, учитывая что это выглядит как просто небольшой слой абстракции над стандартными примитивами.
>Поэтому нет и не надо, хочешь изучать - берешь и сам гуглишь статьи, мануалы, примеры и пытаешься повторить, ничего лучше ещё не придумали.
Это да, но к го это применимо в квадрате. Если в джаве хороших курсов не существует, то в го и плохих не существует.
> джины
Далеко не самая популярная штука, хотя и часто встречается. Труъ вей это взять роутер, какой понадобится, валидатор, какой понравится и тд и тп.
> гормы?
Вот сейчас серьезно и неиронично: горм это самое плохое, что ты можешь втащить в проект. Он хуево сделан, обладает кучей опасных особенностей и при этом ещё и не подходит к го идеологически.
Ни на одном серьезном проекте ты его не встретишь, максимум в виде легаси. И любой серьезный гошник скривится, когда его услышит.
Большое количество звездочек у него это в 99% джуны-воннаби гошники и результат пиара. Ну или перекатуны с джавы, которые по привычке пишут golang orm и потом используют первое, что выскочило.
> Это да, но к го это применимо в квадрате. Если в джаве хороших курсов не существует, то в го и плохих не существует.
Так если никаких хороших не существует, то зачем тебе вообще нужны плохие? Не используй вообще никакие.
>Не используй вообще никакие.
Я лично и не использую. Но то, что говно делится на сорта - всё же наблюдаю.
Да ну не делится оно.. Наверное теоретически можно что-то вынести из курсов. Из чего угодно можно.
Только соотношение вложенных усилий и вообще ресурсов к результату будет крайне неудачным.
Поэтому моё мнение всё ещё такое, что кто хочет что-то изучить - то выбора у него особо и нет, интернет, статьи, книги, мануалы, официальные example project и ответы в чатиках и на дваче опасно, многовато авторитетных джунов.
Не говоря уже о том, что курсы это как правило неудачный разрозненный копипаст хелловорлдов сомнительной давности. А их "менторы" это зачастую те, кто не смог стать нормальным разработчиком. По очевидной причине - зп "ментора" на порядки ниже зп хорошего разработчика.
Репозиторий разбухает как на дрожжах, особенно когда микрописечная архитектура и у тебя 50+ репозиториев с практически одинаковыми зависимостями. Да и в го.мод и так конкретная версия указана, всегда можно подтянуть нужную версию
Это просто не нужно, в go.mod лежат как названия и хеши коммитов, так и чексуммы самих зависимостей. Так что ты в следующий раз получишь ровно те же файлы, что и в прошлый раз, гарантированно.
При этом:
1) Не увеличивается вес репозитория, а качать много метров или даже гигов кода никто не любит; Особенно он увеличится, если ему придется хранить все версии всех используемых либ, а ему придется это делать, если ты будешь их обновлять.
2) Go mod периспользуются между разными проектами, в итоге оно не сжирает у тебя место в системе. Можешь посмотреть в качестве примера на nodejs, где ты в трех сервисах сделал npm install и у тебя количество занятого места в системе резко выросло гигов на пятнадцать; Хотя могло бы всего на 3 хотя и это пиздец
3) Скрывает ненужный дифф в реквестах, показывая только реально изменившиеся файлы в текущем проекте. Изменения внешних либ как правило не важны, так как мало кто прям досконально их смотрит. Обычно ченджлог глянули, убедились, что апи не изменилось - и нормально будет.
4) Так все делают, что ты как маленький.
А в го, я так понял, подход другой? У нас есть хома, в которой один воркспейс go и в нем хранятся все модули? Т.е. не важно где у тебя репозиторий в системен находится, зависимости всегда качаются в ~/go/pkg?
А есть возможность создавать вирт окружения на каждый новый проект? Хочу питон-вэй.
Или поясните почему это мне не надо.
В голанге парадигма пакетного программироования. Один пакет, одгт модули. Все пакеты потом в докер пакуются.
Тебе в го не нужно виртуальное отображение, у тебя все зависимости вообще всех версий для всех проектов кладутся в одну папку, ~/go/pkg, да - и соответственно каждый возьмет ту зависимость, что ему нужна (указана в go.mod).
Всякие питоновые venv'ы - это всё костыли, порожденные изначальной неприспособленностью питона к поддержанию разных зависмостей на одной машине.
Упрощенно говоря, у тебя есть либа А, которая хочет С версии 1 и либа Б, которая хочет С версии 2.
В питоне это будет жопа, потому что питон хранит их в системе просто как "либа А, либа Б, либа С" и не умеет поддерживать в системе раздельно "либа С1, либа С2", без venv и прочего.
В го в системе все пакеты изначально лежат в виде /пакет/версия:
/А/1 (хочет /C/1)
/Б/1 (хочет /C/2)
/С/1
/C/2
Так что такой проблемы в принципе нет, го решает её из коробки.
>Почему к методу обращаются именно через пакет,а не через класс?
нет такого. ни "методов" у пакет, ни "классов".
если обращаются через пакет, то это не метод, а функция. к методу обращаются через тип или через объект.
u := &url.URL{}
u.Query() // через объект
(*url.URL).Query(u) // через тип
Пакеты в го = либы, то есть, нормальные пакеты.
Правило потому что такое, чтобы не создавать ненужных коллизий. Проблем с этом не возникает, просто вопрос привычки.
> к методу обращаются именно через пакет,а не через класс?
Ты обращаешься к содержимому пакета через имя пакета, далее если ты обратился к классу (точнее структуре, мы же в го), то можешь использовать его методы.
import "some/packagename"
func foo() {
classObj := packagename.Class{}
classObj.Method()
}
Также в го нет явных статических методов, вместо них мы используем или функции, или методы с поинтер ресивером, тогда их можно вызвать от неинициализированного объекта редко, обычно такого не надо, почти то же самое:
type S struct {}
func (_ S) PseudoStatic() {
// do anything
}
func bar() {
(S)(nil).PseudoStatic() // стильный вариант
var s *S
s.PseudoStatic() // джуновый вариант
}
Пакеты в го = либы, то есть, нормальные пакеты.
Правило потому что такое, чтобы не создавать ненужных коллизий. Проблем с этом не возникает, просто вопрос привычки.
> к методу обращаются именно через пакет,а не через класс?
Ты обращаешься к содержимому пакета через имя пакета, далее если ты обратился к классу (точнее структуре, мы же в го), то можешь использовать его методы.
import "some/packagename"
func foo() {
classObj := packagename.Class{}
classObj.Method()
}
Также в го нет явных статических методов, вместо них мы используем или функции, или методы с поинтер ресивером, тогда их можно вызвать от неинициализированного объекта редко, обычно такого не надо, почти то же самое:
type S struct {}
func (_ S) PseudoStatic() {
// do anything
}
func bar() {
(S)(nil).PseudoStatic() // стильный вариант
var s *S
s.PseudoStatic() // джуновый вариант
}
Фикс второго кода, который пожрал двач, который до сих пор не умеет в нормальный маркдаун с блоками кода: https://go.dev/play/p/iJ88VOOXnhu
экономящие на байтах буратины. им еще так и хочется навернуть побольше дикой хуиты, чисто чтобы обыграть удаление вендора. например чтобы твой билд в докере лез наружу в какой-то кеш пакетов, чтобы не перекачивать зависимости каждый раз и т.п.
нормальные люди всё вендоряд, а сэкономленное время билда уделяют ревью кода зависимостей, который обновился, чтобы не завезти себе лишние баги и уязвимости.
Я правильно понял что в го структуры это аналог классов? То есть в пакете лежат структуры,в структурах методы функции. И чтобы обратиться к функции нужно сделать пакет.функция а не пакет.структура.функция?
>>586116
Да, аноны, это я все понимаю. Как он хранит свои модули, как хранит питон, какие проблемы и прочее.
Я к тому и спрашивал - мол, правильно ли я понимаю и не ищу ли какое-то второе дно. Похоже, не ищу и готовлю го более-менее правильно. Но это как-то пиздец как непривычно. После питония осталось четкое хотенье своего воркспейса в любом месте в системе со всеми зависимостями и самодостаточного. А в го у тебя твой проект в 20 вложенных каталогах ходит за модулями и настройками в ~/go/
Просто не привычно.
В любом случае, спасибо за разъяснение.
Наоборот, ищу блять. Но теперь перестану.
> Я правильно понял что в го структуры это аналог классов?
Не совсем. Структуры в го похожи на структуры в С. От классов там только возможность задавать публичность/приватность. Методы в го можно сделать вообще для любого типа, включая примитивные, вроде int и bool, контейнеры, например slice (net.IP) и map (url.Values)
>>586028
Пакет это аналог неймспейса из плюсов или шарпа.
Методы в го это штука довольно условная, с механизмом похожим на то как работают методы в питоне - т.е. это функция, у которой первым аргументом идет сам объект. Фактически вызов метода это вызов каррированной функции
>>586128
Статические методы это костыль в языках в которых нет функций и разработчика заставляют ебаться в классы. В го чем-то отдаленным аналогом является вызов функции через тип, например (*S).PseudoStatic(nil). Зачем вообще ввели такой синтаксис я не знаю, единственное где оно выглядит некостыльно - это аргумент для финалайзера https://go.dev/play/p/21xgE0obfnf
В общем просто используйте обычные функции в таких случаях.
Всякие "псевдостатические методы", где на деле просто игнорируется ссылка на инстанс или копия если ресивер не поинтер но он есть это, по сути, не статические методы. Но они тоже бывают нужны, например для имплементации интерфейса объектом без состояния https://cs.opensource.google/go/go/+/refs/tags/go1.19.5:src/io/io.go;l=592
Двачу докер. Кроме того через вендор проще патчить зависимости. У меня на одном из проектов есть makefile target dependency:
@go mod tidy && go mod vendor && git apply patches/fix_hui_govna.patch
Окей спасибо,покопаю поглубже. Пока нравится что язык довольно немногословный и по ощущениям учится очень быстро. С другой стороны печалит что мало информации о кишках
> язык довольно немногословный
Вот это неправда, го многословнее других языков. Если ты не согласен, то просто не сталкивался с местными приколами, тут очень много всего нужно делать явно, что является го вей (и за что го многим не нравится).
К примеру, у тебя есть var iarr []int, а тебе нужен []int64. Что ты сделаешь?
В каком-нибудь другом языке ты можешь сделать i64arr := []int64(iarr) и всё, проблема решена.
В го же тебе придется прям вручную пересобирать слайс:
i64arr := make([]int64, len(iarr))
for i := range iarr {
i64arr = int64(iarr)
}
Я думаю он имел в виду бедный лексикон.
Я имел ввиду что в языке мало ключевых слов,да и возможностей в целом. Первым делом загуглил есть ли в го аналог листа из жабы,говорят используй слайсы. Плюс довольно странно что функция len() возвращает количество байт,а не количество символов. Не представляю зачем мне может понадобиться знать количество байт. Также у меня есть предположение,что го разработчики имеют в запасе кучу написанных вручную оберток и тупо переиспользуют их в проектах. Уже предвкушаю как буду писать ArrayList вручную. Но это в общем то не доеб,а чисто наблюдение. Каким бы не был язык,работает быстро,да и писать вроде достаточно просто,а это главное
> Первым делом загуглил есть ли в го аналог листа из жабы,говорят используй слайсы.
Ага, все списки в го только через слайсы. Есть ещё container/list, но это что-то скорее для собесов, в реальности практически не видел использований.
> Плюс довольно странно что функция len() возвращает количество байт,а не количество символов.
Зависит от контекста. В случае len(slice) - это будет длина слайса, в смысле количества итемов, то есть то, что надо.
В случае len(string) - да, вернет байты. Но там вообще непонятно, что ты хочешь посчитать. Со строками всегда всё сложно, есть к примеру юникод, где один символ может состоять из множества глифов. Пойди разбери, что для тебя "длина" в данном конкретном случае. И да, если тебе нужна прям длина строки в юникоде, или конверти string в слайс рун []rune и уже смотри его длину.
len(string)=bytes же нужно для байтоебства и всяких низкоуровневых оптимизаций. Это тебе не джава, привыкай :)
> Также у меня есть предположение,что го разработчики имеют в запасе кучу написанных вручную оберток и тупо переиспользуют их в проектах.
Неа, в целом в случае со слайсом ты почти всё можешь сам делать руками. https://github.com/golang/go/wiki/SliceTricks в помощь, если на память не помнишь чего то.
Спасибо добрый анон за развернутый ответ
> Уже предвкушаю как буду писать ArrayList вручную.
Чем тебя слайс не устроил? С дженериками много ебли в слайсы стало возможно вынести в отдельный универсальный пакет, например https://pkg.go.dev/golang.org/x/exp/slices, может тебе проще будет просто сделать что-то подобное под свои нужды?
подумай почему append возвращает слайс и нельзя сделать тупо append(s, 123).
слайс это структ с поинтером на начало массива. при передаче в функцию создается копия этого структа. т.е копия len, cap и поинтера. если ты будешь менять какие-то поля (аппенд, например, может поменять все три), то из функции тебе нужно будет его вернуть. а если тупо будешь менять элементы в массиве, то не нужно.
Всё так.
В языке есть только бе и ме, и ты этими бе и ме должен выражать системы арбитрарной сложности. Ессно на выходе получается что-то вроде
KoKoKoKoKoKoKoKoKoKo Kud-Kudah
KoKoKoKoKoKoKoKo kudah kO kud-Kudah Kukarek kudah
Всё так. Методы можно к любому типу прикрутить
Пока что дрючу https://www.practical-go-lessons.com
Помимо очевидного "к чему ещё готовиться" вопроса, интересно ещё, нужно ли зубрить базовые методы и синтаксис?
Многое забыл, и если нужно что-то, обычно открываю cheatsheet.
ну допустим такое
из чего состоит слайс, как работает append, что такое мапа и что за load factor, что такое интерфейс
почему горутины легче тредов, размер стека по сравнению с тредом ОС, какие есть точки переключения горутин, кооперативность шедулера, повесим ли мы всю программу если поставим GOMAXPROCS=1 и зайдем в tight loop, как обрабатываются блокирующие/неблокирующие системные вызовы, что такое нетполлер и на чем он основан, как стеки горутин аллоцируются и почему они фактически бесконечные
фазы гц, зачем нужны остановки мира и зачем нужен write barrier
че там в пакете sync, как реализованы каналы, быстрее ли канал мютекса, в каком порядке селект выбирает каналы, че за атомики и как они реализованы
что такое контекст и для чего используется
Спрашивали про:
>из чего состоит слайс
>что такое интерфейс и про ООП в го
>горутина vs тред vs процесс. Обмен данными между ними(proc-to-proc etc)
>какие есть точки переключения горутин
Про само устройство шедулера.
Описание и примеры проблем с горутинами и как они решаются.
В качестве задачи был факториал, который потом попросили ускорить [с горутинами].
На половине из этого зафейлился.
Спрашивали больше, но это запомнилось и было тобою упомянуто.
Кейворды, которые буду гуглить: NSQ, netconf, gorm xorm burm, b3 tree.
Это я тупой или составители примера?
Почему вместо 0x1e9 написали 1e9 и в результате печатается {1000000000 2} ?
Или в этом примере есть какой-то тайный смысл?
Кстати, откуда берётся 1000000000?
Я сишник просто, вот и подумал, что опечатка:)
И есть ли где-либо в природе сливы оттуда? Хотя бы "проектов", которые они там предлагают сделать.
> смеемся с залетных крестоносцев
Я тут, шалом алейкум. Хочу, чтобы вместе с бэком на Го в одном проекте была Webassembly библиотека на сишечке, собранная GNU make-ом. Можно как-то сделать так, чтобы одним из шагов go build был вызов make? Насколько вообще распространены мультиязыковые проекты на Го - скажем, c фронтом и его линтерами, обфускаторами и так далее, упаковываемым в бинарник бэкенда?
Нет, с go build нельзя, но можно собирать через go generate
Вроде есть что-то типа негласного хорошего тона, что если функция вызывает панику, то она начинается на Must
Ты рофлишь это база чуть ли не из семидесятых годов, только тогда прогеры сами эту нотацию юзали чтобы отличить локальное от нелокального, а теперь это возведено в правило.
Т.е. не знаю как до такой шизы можно было додуматься, но додумались до неё до того как твои мама и папа познакомились.
Только в 2к23-м это не нужно, по тому что можно написать свою функцию must всё равно вне main пакета её нельзя использовать
func must[T any](val T, err error) T {
check(err)
return val
}
func check(err error) {
if err != nil {
panic(err)
}
}
И использование что-то типо такого:
func main() {
file := must(os.Create("/tmp/hui.gv"))
defer file.Close()
}
заглавная буква позволяет обойтись без дополнительного кейворда уровня export совсем, а это функционально не заменит указание возвращаемых типов
невермайнд, я подумал што анон ебнутый и в название функций еще предлагает добавить
"./prog.go:8:14: cannot convert t1 (variable of type T1 constrained by any) to type T2"
Можно как-то это решить? T2~T1 тоже не проходит.
Я вообще вообще могу написать дженерик функцию, которая конвертить сходные примитивные типы один в другой?
Если не могу, то го - говно и ваши дженерики нихуя не решают проблем языка
Твоя проблема в том что ты не понимаешь сути констрентов.
Ты не можешь взять любой тип и привести его в любой (другой?) тип. В общем случае ты можешь только ~T тильда Т привести к Т
Но если тебе нужно не вообще, а именно между числами, что имеет смысл - то и создай себе констрент который будет включать все числа кроме комплексных и конвертируй себе на здоровье
https://go.dev/play/p/kwVNSsnoJcp
Я не хочу только между числами, я хочу функцию, которая позволяет конвертить просто слайс одних типов в слайс других, если эти типы вообще конвертируемы. Числа здесь это частный случай.
>>601970
Хотя впрочем хуй даже с ними со слайсами.
Я хочу просто универсальную дженерик функцию конверсии:
func convert[T1 any, T2 any](t1 T1) T2 {
return T2(t1)
}
Как я могу её написать?
https://go.dev/play/p/fGF0e71N93p ругается
>а давайте сделаем функцию которая делает T1(t2) чтобы вместо того чтобы писать T1(t2) мы могли писать t1 := convert[T1,T2](t2)
нахуя блять далбоеб
Потому что блять в го нельзя конвертить один слайс в другой, долбоеб, я об этом одним сообщением выше написал.
У тебя одна функция возвращает []int64, а другая требует []int32.
И тебе нужно руками создавать новый слайс и заполнять его значениями. Хочется написать одну дженерик функцию для этого, вместо того, чтобы постоянно копипастить этот код.
Тогда ваш го говно, десять лет пытались добавить в язык дженерики и когда добавили, блять, выясняется, что они не покрывают ну самые очевидные ситуации.
ну чтобы добавить ([]int32)([]int64{}) женерики особо не нужны. если бы хотели, добавили так же, как недавние каст массива в слайс и наоборот.
Комментарии всех недовольных там жёстко удаляют.
>Комментарии всех недовольных там жёстко удаляют.
>первый коммент Should be off by default
>ниже Now you guys want to introduce telemetry into your programming language? This is how you drive off any person who even considered giving your project a chance despite the warning signs
ну кажется все точки зрения там есть. нахуй нужен однообразный спам недовольных? пусть ставят эмоджы, их не удаляют.
Берут, по-крайней мере, мы брали пару лет назад. Сейчас хз что на рынке происходит, лично мы вообще найм прикрыли финтех.
Вот в этом храни https://github.com/shopspring/decimal
Поддерживает бд и хранит их правильно, его же используют всякие финтехи и интернет магазины (shopify)
Вы видите копию треда, сохраненную 24 марта 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.