Это копия, сохраненная 1 июля 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
С чего начать:
- В обязательном порядке проходим Go Tour:
https://go.dev/tour/welcome/1
- Читаем документацию прямо по порядку (пункт "Learning Go"): https://go.dev/doc/
- Ознакамливаемся с общим roadmap по изучению языка и сопутствующих инструментов: https://github.com/Alikhll/golang-developer-roadmap (постоянно обновляется сообществом)
Литература:
- Донован, Керниган "Язык программирования Go"
- Также хорошие книги для начала: https://www.golang-book.com/ и https://www.practical-go-lessons.com/ (веб-версия - бесплатная и хорошо подходит для новичков в программировании)
- Книги из списка https://github.com/dariubs/GoBooks
Полезные ресурсы:
- Сборник паттернов и инфы по микросервисам: https://microservices.io/
- Смотрим видео https://www.youtube.com/channel/UC_BzFbxG2za3bp5NRRRXJSw
- Обновляемый список с пакетами: https://github.com/avelino/awesome-go
Небольшая конфа треда: https://t.me/golang2ch более чем живая!
Предыдущий тред тонет здесь: >>2614678 (OP)
Ты создал ещё один тред, но R всё ещё лучше чем Go.
Так свежЫх только 2! Один тухлый! Лера, ТУХЛЫЙ!!!
Ну ты и даун.
Не мог сказать, чтобы на русский сразу переводил?
Доставьте ролик с /dev/null is web scale
Всё перечисленное есть в /dev/null. А ещё он web scale, как ихвестно.
Бинарники гошки весят как ебучие слоны
Полная обратная совместимость. Можно поставить последний компилятор голанга и запускать старые программы. А в дотнете каждый год надо переписывать программы на новый дотнет или маяться с подключением старых дотнетов, которые как правило удаляют из репозиториев и фиг снова установишь.
Эталонное тольковыигрываете и правота в главном.
Сейчас бы на втором году СВО думать о размере sdk
Го поддерживает восьмеричные литералы
Очевидно ты, потому что в репорте написан какой-то нечитаемый бред уровня "я ебаль ийо рука", ну и конечно классика индусоговна "NOT PROPERLY WORKING". Олд тебя бы еще назвал говноедом и обоссал, но очевидно мейнтейнеру КоК этого не позволяет, так что он послал очередного долбоеба нахуй максимально вежливо.
Так это не моя ишью, она же вообще от 18го года. Просто я сейчас столкнулся с этой проблемой, нагуглил только это.
Тогда /s/ты/индус-репортер.
Зарепорти нормально. В тестах у них по крайней мере я конкретно этого кейса не нашел, так что. Конфёрмить лень, сорян
func FuncName(arg []any)
func FuncName[T comparable](arg []T)
Чатгопота мне затирает, что во втором случае якобы нельзя принять слайс с различными типами, а он прекрасно обрабатывается в обоих случаях. Так в чём же отличие?
Да. Сейчас обнаружил различие. Первый случай обрабатывает только интерфейсный слайс. Сколько же пиздабольства я сейчас выслушал от чатгпт. Абсолютно противоположное утверждала.
>Действительно, при передаче []string{"hello", "world"} в первую функцию func_name(arg []any) не возникнет ошибки
>Так она возникает
>Ой, извините
>Действительно, при передаче []string{"hello", "world"} в первую функцию func_name(arg []any) не возникнет ошибки
Программист уровня /b/. Гопоте еще даже вкатуном не быть.
>Чатгопота мне затирает, что во втором случае якобы нельзя принять слайс с различными типами
ну это верно. в []any у тебя в каждом элементе могут быть совершенно разные типы.
а в []T у элементов будет один тип, который соответствует констрейнту. т.е. нельзя float32 и int например смешать.
Лол, действительно. Попробовал твой код на локалхосте запустить, тоже всё работает. Мистика какая-то. Спасибо!
не такой же
Что ты имеешь ввиду под миграциями? Если про создание таблиц в бд, то у тебя есть CREATE TABLE IF NOT EXISTS, буквально ее любая тулза для миграции и заводит лол
mymap := map[string]int{"a": 1}
point := &mymap["a"]
*point = 2
map[string]*int, мапы это не обычная переменная, тебе возвращает копию, а не сам элемент, что вполне ожидаемо
>map[string]int
Это надо тогда кучу переменных пихать. Типа:
var1 = 1
mymap := map[string]int{"a": &var1 }
Без такого оверхеда вариантов нет?
Блядский двощ сожрал астерикса.
Так ты в любом случае так или иначе будешь из переменной какой то его пиздить, а не добавлять вручную, и про какой ты оверхед я что то не поняла, уж выделить 4 байта на указатель процессору будет явно не тяжело, поверь
Дополню
Если прям совсем лень создавать переменную, то можешь сделать, только не забывай, что оно будет указывать уже на новую переменную, а не твою оригинальную, если ты туда for some reasons будешь передавать что то другое, не могу представить только зачем
func newPtr[T any](val T) *T {
return &val
}
Я не знаю, что такое миграции, потому что нигде толком про это не пишут. Слышал, что надо скачивать программы с гитхаба от левых чуваков и они генерируют эти миграции. Зачем? Не знаю.
Вдруг меня на собесе спросят про миграции
1. Это вообще не связано с языком. Ты можешь тот же ликвибейз взять и использовать.
2. Если нормальная прод система, то да надо использовать и миграция это отдельный шаг выката на прод.
Я бы сказал - нет, достаточно знать что они есть и представлять как в целом они работают. Но сколько компаний столько и мнений, меня пару раз в тестовых просили создавать базу с помощью системы миграций.
я правда не вкатун
a := []int{}
b := *new([]int)
c := make([]int, 0)
Иди читай учебник "алгоритмы и структуры данных", 1 курс любого технического вуза. Чтобы более не задавать подобных вопросов.
>Нахуя нужны два оставшихся
Это же ГОВНОЛАНГ, простой язык! Поэтому мы добавили десять синтаксисов для каждой фичи, а также завезли неоднозначность грамматики, ну чтоб было веселее. Простота!
>a := []int{}
this
>Алгоритмы
Рано ещё, но обязательно буду.
>Структуры данных
А вот здесь охуел, копнув лишь немного. Оказывается все языки программирования их повторяют один в один. Спасибо, читаю.
ну кроме ебаной макаки я думаю все поняли что я имел в виду
Я понял, что ты хочешь сделать. Так делать не надо. Даже если бы было возможно - не надо. Не делай так. Поверь дяде, кака это плохо, брось каку.
гайсы, а есть у кого программа/скрипт, чтобы копировать все медиа с треда?
Готов купить тг @dima_ermolaev1999
То есть не очевидные шаманства с массивами и срезами через поинтер это не кака, а тоже самое с мапой уже кака?
Мапа в го периодически двигается в памяти с места на места. Надо тебе ебатория о том почему у тебя вдруг указатель указывает на нихуя и ты внезапно ловишь сегфолт? Надо бля?
пик 1. Почему capacity слайса уменьшается только в этом моменте
s = s[2:]
Тут мы выкинули первые две цифры из слайса и объем его уменьшился на эти 2 цифры. Но почему чуть выше где
s = s[:4]
объем слайса не уменьшается?
пик 2. Пустой слайс поначалу. Добавили 0, длина - 1 и объем - 1.
Потом добавили 1. Длина - 2 и объем - 2.
Потом сразу 3 цифры добавили. Длина стала 5. Но почему объем стал 6?
Ну значит щенок слушай
>1. Почему capacity слайса уменьшается только в этом моменте
Потому что слайс обрезается только с одной стороны, со второй тебе его и возвращает, считай просто оффсет
>Тут мы выкинули первые две цифры из слайса ~snip~
А тут ты считай взял весь массив целиком, без оффсета, но длину ему только 4 указал
>~latest snip~
А все просто, собсна капасити увеличивается не так, как увеличивается длина, капасити у нас длина помноженная на два, и собсна увеличивается, если при добавлении у тебя len > cap становится, после тысячи там уже по 10% только добавляется
Если тебе нужно прям конкретно почитать как работает конкретно сейчас - https://github.com/golang/go/blob/master/src/runtime/slice.go#L157
Надеюсь я помогла тебе понять что это такое
Проблема некст: нужно получать мультипарт частями и отправлять полученную часть на другой сервер (minio), не записывая весь файл в память, так вот возник вопрос, есть ли возможность это реализовать или это ебанина такая же как и мой говнокод, который я настругал, пытаясь решить эту задачу?
Отправлять тоже частями, а как ты собираешься иначе сделать, не держа в памяти?
Учись у лучших умов - создателей 1С битрикса. Хуяришь гигабайтный файл в base64 и все
>Тут мы выкинули первые две цифры из слайса и объем его уменьшился на эти 2 цифры. Но почему чуть выше где
>s = s[:4]
>объем слайса не уменьшается?
Ну допустим твой слайс [0:5] это длина от Москвы до Нижнего Новгорода и он уже аллоцирован. Если ты обрезаешь его [2:5], то это расстояние от Петушков до Нижнего Новгорода. Аллоцировано при этом всё расстояние от Москвы, но ехать тебе только от Петушков до НиНо и не дальше. А если обрезать [:4], то это расстояние до Дзержинска от Москвы, но при этому у тебя есть уже аллоцированный запас до НиНо.
Как правильно переносить длинные строки кода? К примеру, есть длинная строка с сигнатурой метода, то как её перенести на новую строку, чтобы было красиво, читабельно и идеоматично?
Если просто какой-то параметр функции перенести, то он выравнивается по первому табу и сливается с кодом ниже. В итоге получается не читабельно, но именно так выравнивает линтер. Может надо делать как-то по другому?
Как делает go fmt так и писать
>Как правильно переносить длинные строки кода?
Не писать их. А если тебе приходится, то у тебя как раз проблемы
>reflect
>interface{}
>panic
Ебать у тебя там целый обитель говнокода, тебя в школе обижали, да?
спасибо тебе добрый человек
Дак никто не скидывает книгу, где пишут реальное веб-приложение не как в дотнете. Единственный, кто показывает как можно написать реальное веб-приложение, пишет всё как в дотнете. Приходится разбираться в этой дотнет параше с рефлексией и тонной абстракций на абстракциях.
Книга даёт гарантии, что информация достоверна, не оборвется на полуслове, можно планировать своё обучение.
Видосики не нравятся, в них много мусора и темп редко совпадает с моим. Автор либо тараторит, либо засыпает. Ещё раздражает, когда полчаса разглагольствует, а потом за 5 минут торопится выдать всю инфу. Встречались даже курсы, где препод не успевал дописать программу за пару, в итоге у тебя оставался незаконченный пример. С книгой такого нет.
Дак что ты предлагаешь? Как научиться писать реальные веб-приложения профессионального уровня?
Так, блеать. Я тоже где-то читал, что len и cap зашиты в коллекции. Насколько тяжки для приложения частые вызовы len() и cap()?червяк
len() и cap() это метаданные переменной твоего слайса
https://github.com/golang/go/blob/master/src/runtime/slice.go#L15
Вызывать их тоже самое, что и спиздить поле из структуры, можно зааппендить в какой то слайс новые значения (главное что бы капастили не привысилось), тогда ты увидишь фокус, что сама длина массива как бы уже выше, но len твоей переменной все равно остался прошлым
Какая ещё опасность кроется в превышении capacity? Поинтеры сразу слетают при перераспределении?
Это просто для примера, что у тебя метаданные капасити и длины остались теми же, но при этом фактическая длина выше прошлой
Из не инициализированной map можно читать она ведет себя как пустая, а вот при попытки записи будет паника. Решение крайне хуевое, потому что нужно знать про эту "фичу" когда дебажишь сообщения с паникой.
ну я стараюсь этих двух вариантов придерживаться, aka единственные два варианта, где перед телом нет отступа и тело визуально не смешивается с сигнатурой. gofumpt помогает.
гугл конечно советует переносами не упарываться https://google.github.io/styleguide/go/guide#line-length
Мда, поинтер остаётся на старом адресе и можно соснуть крепко.
a := make([]int, 0, 2)
a = append(a, 123)
point := &a[0]
fmt.Println(point, a)
a = append(a, 4, 5, 6)
a[0] = 789
fmt.Println(point, a)
А как ты собираешься это хотя бы теоретически реализовать, у тебя физического места нету, а значит нужно делать новые указатели, переносить куда то их, ничего странного в этом поведении нету, это вполне ожидаемо, такое везде
Ожидаемо для тех, кто давно рулит памятью. Питонистам и прочим скриптомакакам не очень ожидаемо.
Если надо, могу помочь с чем то в телеге, но скорее буду отвечать на вопрос/ответ как что работает или как что сделать, менторить прям полноценно не смогу, только вопрос-ответ
Не я. А там омежку какого-то по приколу обвинили в програмирывании краж денег с карт. Майоры с двача вызывали мамку вкатуна на допрос.
Спасибо. Но думаю зря потрачу только твое время. Я вкатываться во фронт буду. Бэк слабо знаю. И ещё не определился на чем изучать его. Параллельно ковыряю пхп, сишарп и го. Но все же склоняюсь к пхп. Уж слишком мало у меня говакансий
таки я не жалуюсь
А в чем конкретно проблема? Перекидываешь из одного сокета в другой через фиксированный буфер в памяти. Что именно у тебя не работает в таком подходе (самому интересно)?
>В чем проблема сделать структуру, если у тебя настолько много параметров? Если больше 3, значит однозначно нужно делать
Это не имеет отношения к тому, что я писал.
У пастерка задели его эго :XXXXXD
Есть ли вкат, и нужен ли?
Вкат есть, но голанг не выучить, потому что никто не пишет как писать реальные приложения на нём.
Это нытик вкатун, забей
Это не мемы, а ограничение инфы по голангу
Это местный шизоид, которому требуется книга по любой хуйне, можешь забить, там уровень айсикью не превышает полсотни
Вот у жсеров есть очень толковый Илья Климов, стримы которого всегда интересно смотреть, есть ли кто-то подобный у гошников?
Как можно смотреть лекции по программированию? Как вы это делаете, зумеры? Говорящая голова гнусаво полчаса проговаривает то, что можно прочесть за пять минут, а по диагонали - 9а полторы
Можно подумать, что кто-то что-то не из книг смог предложить. Я привёл пример книги Адама Фримана, где разрабатывается полноценное приложение, а в ответ только насмешки. У вас нет альтернативы или просто не хотите делится из-за жадности. А жадность и глупость всегда идут рядом и явно не признак высокого айсикью.
Попробовал много всякой хуйни, по итогу сошлись на мнении, что мультипарт нормально не парсится на части в потоке, а прокидывать полностью не получается, потому что мимы файла теряются при такой передаче(хотя сам файл в потоке сохраняется и оперативу не жрёт, только после выгрузки, ты нихуя с ним уже не сделаешь, потому что из архива получилась тыква). Сначала нужно на принимающем серве закинуть мимы, потом файл. Если есть предложения, как это правильно прокидывать, то было бы неплохо описать процесс, потому что все примеры из этого вашего интернета говна кусок, которые сначала прогружают весь файл с мимами в оперативу, потом льют на другой серв/сохраняют у себя на постоянке
ну на практике в 99% случаев чтобы замокать зависимости и написать юнит тесты, покрыв хуево тестируемые кейсы (сетевые походы или неожиданные ошибки от БД например).
в 1% случаев чтобы иметь код, который может работать с разными имплементациями одного интерфейса, потому что бизнес-логика так легче реализуется. (да-да, в сишке как-то без этого костылилось, но все-таки)
Конкретно на данном примере это передать сложно. Но представь себе ситуацию, когда у нас ручка идет в базу и еще в несколько мест. Ты как хороший программист будешь писать тесты для этой ручки, соответственно в твоем тесте при этом раскладе тебе придется идти в базу, что не очень хорошо. Куда лучше будет, если твой handler/router не будет зависит от конкретной реализации репозитория а будет просто ссылаться на интерфейс, который должен реализовывать какие-то там методы. В данном случае репозиторий можно очень просто мокнуть и протестировать ручку. Кроме всего прочего когда твоему хендлеру просто нужна хуевина которая условно умеет только Get/Set. То ей по факту вообще похуй на реализацию, это может быть что угодно. База, диск, облако, сесть.
Хочу услышать совет, можно ли подобный механизм реализовать вообще и если да, то как это можно эстетичнее сделать.
ну ты же в качестве колбека передаешь функцию с другой сигнатурой. ...any это не TestRequest.
принимай тупо func() и не еби мозги. в месте вызова пользователь сам решит что оттуда вызвать.
func safe(lock *sync.Mutex, f func())
Спасибо, отличный перевод. Сразу стало понятно.
Плагин для VS Code дико тупит на всех этих передачах функций.
А, значит я не совсем уловил семантику работы сигнатур вместе с any. Просто суть в том, что я хотел бы пробрасывать функции вообще с любой сигнатурой в Locker. Как если бы мой общий тип при каждой конкретной подстановке редуцировался до конкретного типа принимаемой функции. Почитал про дженерики немного и смог родить вот это
type General[Get any, Return any] func(Get) Return
Но теперь проблема в фиксированной арности моего коллбека, ровно один аргумент принять и ровно одно значение отдать. f func() так же выдаёт ошибку типов. Просто хотелось бы сделать что-то вроде как пикрилейтед в плюсах: есть общая сигнатура функции с переменными типов, при подстановке конкретной функции конкретный типы соответственно выводятся. Но судя по всему так сделать не получится, либо выйдет уродство совсем.
> семантику работы сигнатур вместе с any
В го нет ко- и контрвариантности. Это простой язые. Поэтому []byte и any[] - это разные вещи, func() byte и func() any - тоже разные вещи. Иногда их можно скастовать руками.
Дада, безусловно, и тем не менее.
В общем решил всё таки просто func() T передавать, замыкать на аргументах и каждый раз явно возвращаемый тип указывать, вышло что-то вроде такого:
func Locker[Return any](mu *sync.Mutex, func() Return) Return {...}
Вроде даже выглядит не очень плохо, благодарю всех за пояснения.
Ну вперёд, сделай жир ьещ any. Это простой язык, и any в нём будет ак туален всегда!
// капча вражда
Нехороший ты человек конечно. Из-за таких как ты потом нихуя не очевидно с чем функция работает. Сложно тебе по жизни будет
Функция работает с чем надо. Просто нельзя напрямую сделать тайп свитч от T. А от any можно. Простой же язык. Просто сделай переменную, которая тете будет нужна только для проверки типа, сделай из нее any - и проверяй на здоровье!
А ещё мне очень понравились теги структур. Такие себе атрибуты в простом языке, для простых. Работать с которыми можно только в рантайме, а создать только при компиляции. Шикарный дизайн.
А зачем тебе собственно возвращать какие то там аргументы, почему так сложно сделать функцию которая не имеет в себе аргументов и ничего не возвращает? Это будет удобнее и понятнее лол
> А зачем тебе собственно возвращать какие то там аргументы
Потому что я хочу сделать обёртку над уже имеющимися функциями, которые возвращают определённые значения. Более конкретно, я для себя пишу бек сервера, которые жсонки принимает и возвращает. Вот у меня есть такая функция для обработки конкретного запроса:
func SomeModel(req SomeRequest) SomeResponse { return SomeResponse{} }
Она использует переменные, которые шарятся между другими подобными функциями, потому при вызове я хочу их лочить. Собственно SomeModel превратится лёгкой рукой в
func SafeSomeModel(req SomeRequest) SomeResponse {
return Locker(&mu, func() SomeResponse { return SomeResponse{} })
}
Не очень понимаю, как здесь без возвращаемого значения. На ум приходит только так же переменную завести и потом на неё замыкать, а после выхода возвращать, но это получается не
> удобнее и понятнее
имхо.
Мутишь какую то ненужную дичь, которая только добавит лишних строк и лишний уровень абстракции
Ну лично мне полезно было, пока пытался это запилить лучше прояснил для себя систему типов местную. Про ненужные абстракции согласен, но это игрушечный проект, а значит полная свобода для экспериментов.
Ни капли, классический mutex.lock() с анлоком выглядит куда чище лишних абстракций и усложнений кода, как и будет отсутствовать оверхед, но лучше всего использовать атомики и синк.мапы, если у тебя дело с переменными и их не слишком много
Только ни тот, ни другой не рассказывают как писать реальные веб-приложения.
Похуй, я же не макака как ты чтобы не разобраться
Попробуй сначала на ноде писать, на express. На ютубе миллион видосов обучающих как вебдрисню писать. Потом на голенге возьми ozzo-routing (очень похоже на express) и перепиши с ноды на гошку.
>Не очень понимаю, как здесь без возвращаемого значения. На ум приходит только так же переменную завести и потом на неё замыкать, а после выхода возвращать, но это получается не
это классический паттерн. Once.Do тебе не возвращает ничего, errgroup.Go возвращает только ошибку, которая используется в самой логике errgroup и так далее. уже вангую варианты "для удобства" с двумя значениями, а еще значением и ошибкой
Если хочешь интересных людей, то смотри в сторону хаскелля, кложи, эрланга, ну раста на худой конец. Там сильные комьюнити.
,Жаль.
От вакансии зависит. Но обычно если и требуется то попадает под раздел "желательно"
Чаще всего да, но обратное тоже попадаетя
А про написание реальных веб-приложений вообще ничего не найдёшь
Какой язык - такая и документация.
Gin это вообще рофель. "Посоны, смарите Hello World! Поняна? Ну дальше сами разберётесь. Вот сорцы".
>"Посоны, смарите Hello World! Поняна? Ну дальше сами разберётесь. Вот сорцы".
Ты только что гугель вей.
Сук, тебя затралили челик. Неиронично тебе советую, иди в пхп тред и если балду не будешь гонять, года через 3 возвращайся
У тебя талант выбирать неудачные решения. С сисярпом туговато в Рашке будет после ухода микрософта. Может и не будет но есть риск обосраться по итогу пытаясь вкатиться туда
Первым языком лучше питон или пыху или жаву брать. Байтоёбство в го/с/крестах/шарпах без дроча матанов в вузе == лютое падение мотивации от постоянных проблем с пониманием.
Go простой инструмент и не так зависим от экосистемы как огромный неповортливый сисярп энтерпрайз
Сходил прочитал про дженерики. Ничего нового или хотя бы интересного - здесь можно, а здесь нельзя потому что убогий недоязычок не разрешает вам делать это
На шарпе крайне много вакансий в рф, на гошке считай их вообще нету, сравнивая с шарпом.
Но на шарп если джуном идти, то там фуллстек в основном
>На шарпе крайне много вакансий в рф
Повеселил. Там как с питоном если левый шлак отсеить который к твоей области деятельности отношения не имеет то остается не так уж и много
>на гошке считай их вообще нету
Так гоха и не для тупых вкатунов, сто раз уже поясняли.
Заебал пиздеж про шарпы на дваче, особенно от вчерашних пхпшников
Вот вакансии на шарп веб в москве с фильтром по названию:
461 вакансия «(C# or net) NOT unity NOT desktop NOT QA NOT xamarin NOT gamedev NOT wpf NOT winforms»
Покажи сколько на го? Там половина выдачи будет яндекс.го и танцовщицы
Ты еблан тупорылый, даже чатгпт и то лучше контекст понимает чем ты. Мы не в вакууме сравниваем шарп и го а конкретно для дауна вкатуси выше. И в контексте этого что шарп что го неудачные выборы.
>А какое отноешние мелкософт в России имеет к рынку шарпа?
Для шарпа есть две IDE и обе компании ушли. inb4: VS Code не IDE, там нехватает всяких ассистентов для ентерпрайз фигни
Пользуюсь Иде от второй компании, не знаю, куда и откуда они ушли, меня это не касается. ЧЯДНТ? А кабанчик могут и прдскочить с Корп. лицензиями.
Кстати, чем vs камунити принципиально хуже проф?
>ЧЯДНТ?
Пиратишь.
>Кстати, чем vs камунити принципиально хуже проф?
ASP.NET и прочий энтерпрайз не поддерживается.
>Пиратишь
Да похуй. Я использую - возможность использования есть, и похуй кто там ушел кто нет. Может ещё и Винду не использовать? Я с виндо был когла мелкософта здесь ещё не было, я с ней и сейчас, когда мелкософта уже нет. И половина страны таких, ну кроме червей-зумеррв, конечно.
Чел, учи любой язык, хоть голанг. Перекатиться на другой потом будет очень легко. Работы для вкатунов действительно нет, ибо требуют хотя бы 2-3 года опыта в разработке на любом направлении.
Я собираюсь устраиваться уже этой осенью, а ни когда-то потом. Вообще, хотел уже в мае, но понимаю, что уже не успею.
Вкатуны нужны, только чтобы заплатить шекели барыгам со всяких манякурсов по пограмированию, больше они нахуй никому ненужны (тут гуглометы сокращают синьоров тысячами, а эти в го в рф без опыта собрались вкатываться, лол)
учите лучше станки чпу, скоро будет спрос
Тогда ищи по знакомствам. Вкатунов надо менторить жестко. Это на пыхе тебе добрый дяденька мидол будет полгода сопельки подтирать, а в гошке кровавый тырпрайс, там не до разжёвывания очевидных вещей.
А ты думаешь почему во всех рейтингах зарплат голанг в топе? Как раз из-за малого количества джунов с низкими зп.
>>673102
Тяжело тебе будет вкатиться. Судя по твоим постам у тебя туго с восприятием инфы. Я сомневаюсь что даже в пхп сможешь вкатиться
>>673122
Еще варик хорошего ментора за деньги найти. Некоторые даже реальные задания дадут со своей работы. Но сомневаюсь что у тутошных нищих вкатусь есть деньги
>Так гоха и не для тупых вкатунов, сто раз уже поясняли.
Вообще-то для тупых, го создавался для дещевых индусов лол, которые способны чуть ли не копипастом ебашить микросевисы, над ними стоит погонщик поумнее, который будет их бить палкой по рукам, если что не так.
Задачи которые решаются на го не для новичков. Только дауны судят сложность работы по инструменту лол. Я за последний год кодил на расте, го и ноде. И задачи на ноде той же бывали сложнее чем на расте. А когда на с++ том же работал то кучу тупых вкатунов набирали несмотря на сложность самой сишки
Причина тряски? Я на твое место говнаря не претендую, успокойся.
По факту тебе сказать нехуй.
Да да, чем меньше тупых вкатунов тем лучше. И слава богу что гоха на уровне вакансий уже их отсеивает. Так что вкатывайтесь, не стесняйтесь. Крылышки все равно обломают лол
https://setapp.com/how-to/use-go-with-mysql
Ну то есть как сделать так шоб читать со слейвов писать в мастеры? В мануале только
sql.Open("mysql", "root:<yourMySQLdatabasepassword>@tcp(127.0.0.1:3306)/test")
Там только эйчарки, которым похуй на домашнее пиратство. На него всем похуй, всё равно почти весь доход с продажи лицензий идёт от организаций.
upd: я правильно понимаю что нужно сделать connect к слейвам вручную, а потом при операции "чтение" выдавать рандомный из коллекции конекшонов?
Я так и не смог ломануть голэнд
>upd: я правильно понимаю что нужно сделать connect к слейвам вручную, а потом при операции "чтение" выдавать рандомный из коллекции конекшонов?
В целом - да. Два пула, один RW, второй RO. Вопрос как внутри балансировать, как простейший вариант round-robin сойдёт.
чтобы было не уровня хеллоу ворлд но и не уровня написать постгресс с нуля
чтобы обязательно внутри были алгосики
Я планировал написать бэк-сервис и фронт на шаблонизаторах, они общаются между собой через REST API и gRPC. Но потом мне сказали, что в голанг вкатунов не берут и я расстроился. Теперь думаю куда идти: в РНР или сишарп. Оба языка мне не нравятся. Первый переделали под джаву с корявыми инструментами. Второй загажен синтаксическим сахаром.
На шарпе тоже не особо в цене вкатуны. Но в целом так про все можно сказать. Так что единственный реальный вариант пхп и есть. Ну и 1с еще
Нет. 1С - это дорога в один конец.
Если и возьмут то на общих основаниях. То есть никакого преиущества перед остальными вкатунами не будет. С пхп еще можно что-то как-то конвертировать.
Та сам не сможешь. 1С отформатирует твои мозги раз и навседа. На низком уровне.
Сделай без фронтенда. Пользователь загружает файл с кодом, выбирает компилятор, берет данные из файла инпут достает из файла аутпут. Ну или из сосноли, как ему больше нравится.
А задачи храни в виде наборов интутов и аутпутов
да там три <input> на страничке - два текста и кнопка. ну и один текст нужно будет научиться заполнять ответом от сервера. вот реально задача для стажера, чтобы он познакомился с фронтом минимально.
Мало что можно написать онли бекенд, можешь написать низкоуровневую хуйню, что бы просвапать регистры и заводить указатели на C функцию прямо из гошки (сейчас оно требует мост пастить, что дико неудобно)
Опыт релевантен только коммерческий и только в компании, все остальное - никому не нужный мусор, тебя просто будет отсекать еще хрюши, а не техи
он добавит 3, но после второго апенда
Копировать элементы слайса в другой слайс в Go просто, но это нужно делать с помощью встроенного copyили же appendфункции. Если вы просто присвоите существующий срез новой переменной, срез не будет дублироваться.
Обе переменные будут ссылаться на один и тот же слайс, поэтому любые изменения значения слайса будут отражены во всех его ссылках. Это также верно при передаче слайса в функцию, поскольку в Go слайсы передаются по ссылке.
https://()freshman.tech/snippets/go/copy-slices/
он добавит 3, но после второго апенда
Копировать элементы слайса в другой слайс в Go просто, но это нужно делать с помощью встроенного copyили же appendфункции. Если вы просто присвоите существующий срез новой переменной, срез не будет дублироваться.
Обе переменные будут ссылаться на один и тот же слайс, поэтому любые изменения значения слайса будут отражены во всех его ссылках. Это также верно при передаче слайса в функцию, поскольку в Go слайсы передаются по ссылке.
https://()freshman.tech/snippets/go/copy-slices/
fmt.print подними выше второго апенда
Аппенд идет у тебя на len()+1, а длина твоего Х = 0, додумаешь дальше сам? Аппенд не изменяет метаданные массива, но возвращает их
да это не вопрос был. я конечно пример не рассосал
Это не понимаю. Я понимаю, что пакет нужен в куче файлов, а мне не охота делать "проекты"тм на скрипты уровня хелло ворлд.
Скчал значит курс по GO, в ожидании что меня научат как можно интегрирывать Go с пыхой как json чики получать и отправлять и тд.
по началу все было легко синтаксис и тп и тут началась лютая дрочь с математикой. Определите периметр/площадь/ решите ебаное уровнение, определить кол-во корней и тп.
Неужели в GO нельзя быть крудошлепом и просто в распаралеливать запросики в БД.
Кстати когда начал вкатываться, мне посоветовали начать с питона. Начал тогда смотреть курс по питону на ютубе и когда началась подобная хуйня с математикой я дропнул т.к. не понял нахуя все это вообще нужно и занялся версткой.
Его и использую, но есть узкие пёзды места с лютым матаном, где голанг в разы быстрее гоняет байты.
Да я к этому готов, сейчас посмотрел вообще че за курс скачал, он вообще для студентов каких то.
Чел рассказывает про условные конструкции, типы данных а задачки задает связанные с матаном.
Я такое не вывезу. Буду искать что то чисто с web разаботкой на GO связанное.
Можно, конечно, просто ты взял какой-то курс от шизов, которые дрочат на базу и классический подход к обучению. Это почти то же, что в вузиках, когда не можешь сдать лабу по программированию, потому что не осилил какую-то залупу из математической физики, хотя само программирование знаешь лучше препода.
спасибо анончик, я думал меня тут попустят если честно.
Теперь я точно уверен что просто не туда полез, жаль что 2 дня потерял на это.
Это давняя проблема со многими курсами, тянется ещё из 80-х, когда это ещё имело смысл. Сейчас можно смело скипать подобное. Тысячи новичков вообще забросили программирование, потому что вместо самого программирования их пичкают ёбнутыми математическими задачками.
Используй IDE, Люк.
>а import "github.com/atotto/clipboard" уже требует какого-то нездорового пердольства go.mod
т.е. тупо сделать go mod tidy?
о существовании модели акторов с разделяемой памятью
о динамической линковке
об обобщенном программироние и о о функциях map, filter, reduce
и вообще судю по убожеству первого пейпера (и это-то после 30 лет опыта в белл лабс!) выдал какой-то полуси с корутинами и в дизайне яп не особо рубит
если бы не Дмитрий Вьюков, поднявший в свое время ГЦ голанга из той параши, где он находился, язык так и остался бы никому не нужным
Хуеватая система импорта, зашивающая в имя пакета путь в рептозитории, а если надо обратиться к защищенной репе, то скреды прописать ЯВНО В СТРОКЕ ИМПОРТА
ВНЕЗАПНО nil, переданный как значение в тип unterface{} перестает равнятся своему же значения
Язык объективно хуевый, чего стоит одна система типов, требующая постоянных подсказок в виде явного объявления типа над функцией. Вывод типов? Ленивые вычисления? Автор так и остался в Bell Labs середины 70-х.
Нет постоянного стандарта на язык, а только какие-то "отчеты".
И многое другое!
> Аряяя тут нет ненужной хуйня которая никому не всралась значит хуйня
Макака с эффектом даннинга Крюгера не палится
Алсо нашел совершенно шикарную дискуссию на гитхабе. Типа, а давайте так сделаем? А ему в ответ - ничего мы делать не будем, потому что или нахуй. Как всё-таки ЭТО могло стать популярным?
>Типа, а давайте так сделаем? А ему в ответ - ничего мы делать не будем, потому что или нахуй.
Все правильно сказал. Это совершенно минорная фича чтобы тратить на нее время.
капча тоже намекает что тебе стоит пойти нахуй
Таков путь.
Мягкие викинули линупс с maui, где он изначально и был, замарин.формс.
Это очень похоже на:
https://ru.wikipedia.org/wiki/Embrace,_Extend,_and_Extinguish
Мягкие также продвигают свою ось, новый дотнет уже не дружит с 7, хотя поддержка только недавно прекратилась. Хотя сейчас это прям тренд, но раньше языки так быстро по ОС не скакали. Если ты веб макака, то пох, но если есть клиенты, то гемор. Нахера двигать свою ось через разработку, денег мало чтоль.
ООП говнище само по себе, усложнение на равном месте. Писать легко, сопровождать гемор.
Анальная привязка к IDE, так как из-за ооп хер разберешься что тысячи пустых классов делает и что подключать. А так как классов тысячи, нахвание у них на четверть экрана.
Таскать всюду вирт машину, если не тоскать получи под две сотни мб хеллоу ворд у которого будут все равно еще какие-то файлы помима экзешника, в общем, хер поймешь в общем.
Но у го ппц какой кривой дизайн языка, я бы лучше раста накатил.
Семёрку далеихпом не поддерживает. И вообще проблемы бы не было, не будь детсятка говном, а 11 - отборным говном.
Ппц тебя скрючело.
Так то срать какой продукт что не поддерживает, хром монополист, может говнить себе в штаны, но вот эта тенденция языков, такого раньше (лет 10-15 назад) не было, чтоб в момент сразу все к херам бросать. Забавно что го все еще поддерживает 7.
https://github.com/ornicar/lichess-old
Обратите внимание на файлы deps и deps.lock.
Очевидно, что это разрабатывалось до появления композера.
Ничего не напоминает?
А что, если гошке не хватае НОРМАЛЬНОГО менеджера пакетов/зависимостей? Или текущее состояние вещей вам норм?
Шарп - это не только язык, но и платформа, виртуальная машина. Вот есть моноч к примеру - он идёт на семёрке?
Так я почву и пробиваю, стоит ли этим заниматься или и так всё нормально.
Ну вот тебе самому как?
Чем тебя go.mod не устроил?
go get и go install в данном случае не работают.
Мб пририсовать еще годик полтора?
А ты уверен, что у тебя проблема в годах опыта, а не в том, как этот опыт описан? Если что «пук срень пыха ну так пук лара пастил» не подходит, тебе нужно во всех интимных деталях объяснять чем ты занимался, какие паттерны использовал, технологии (даже самые смешные и простые)
а зачем тебе устанавливать его?
если там бинарник, то делаешь go install github.com/google/gopacket@latest
если не бинарник, то тупо добавляешь его импортом в код и делаешь go mod tidy, он автоматом скачивается в кеш покетов
>чем ты занимался, какие паттерны использовал, технологии (даже самые смешные и простые)
Пиздец ты жалкий кретин. Такую хуйню обычно говно из гнойный аутсорс-бодишопов пишет в своих сраных резюме
инициализировать что? это сервисный слой в коде? ну самое простое это вместо походов друг в друга сделать чтобы они ходили в общую зависимость
Первый: забилдить фронтенд, бэк без апи, скомпилировать фронт + бэк в один бинарь.
Второй: забилдить фронтенд, скомпилировать бэк с апи, фронт с бэком общаются через апи.
На какой стул сейчас принято садиться в промышленной разработке?
а еще интерфейсы нихуя не понятны.
type geometry interface {
area() float64
perim() float64
}
type rect struct {
width, height float64
}
func measure(g geometry) { //тип geometry
fmt.Printf("%T: %+v\n", g, g)
fmt.Println("area:", g.area())
fmt.Println("perimiter:", g.perim())
}
r := rect{width: 3, height: 4}
c := circle{radius: 5}
measure(r) // тип rect
как же блядь это странно и не интуитивно понятно.
На второй стул. Бэк ничего не знает о фронте, фронт деплоится отдельно на какой-нибудь Nginx.
Т.е. оба крутятся на локалхосте, но бэк там и остаётся, а к фронту можно стучаться из интернетов через реверс проксю? Первый стул считается эталонным говнокодом или допустим в отдельных случаях?
Хост не обязательно один и тот же, это смотря как построить инфраструктуру. Бэк в любом случае будет доступен из интернета в обход фронта, какими проксями ни обмазывайся, фронт же должен их как-то дёргать с машины пользователя.
Первый стул сам по себе не говнокод, просто инфраструктура будет менее гибкой, но это не всегда критично.
>Первый стул считается эталонным говнокодом или допустим в отдельных случаях?
конечно же допустим. тот же pprof сервит страничку со ссылками https://cs.opensource.google/go/go/+/refs/tags/go1.20.3:src/net/http/pprof/pprof.go;l=412
>>683752
>бэк без апи
может я чего-то не понимаю но как ты с ним общаться будешь??
> может я чего-то не понимаю но как ты с ним общаться будешь??
Будет как в пхп вместо жсонов отдавать срендеренные на сервере хтмлы.
ну в SSR ничего плохого самого по себе нет, но помимо этого там же все равно же апишка будет для всяких кнопок формочек тили-вили
То есть вместо жсонов будет x-www-url-form-encoded? Это тоже API, хоть и ограниченное примитивными key-value парами.
> как же блядь это странно и не интуитивно понятно.
Что в этом непонятно? Разве так сложно понять, что интерфейс в твоем случае означает просто условие, что передаваемый тип должен иметь эти функции, ВСЕ
Дай угадаю, питон-макака? Только там настолько тупые могут быть
Ну кто то жалкий, а кто то просто ищет работу. Как бы тебе не нравилось, но это суровая реальность, к которой тебе придется привыкать и изучать, ибо на собесах как раз и спрашивают про них
> от создателей таких шедевров, как UTF–8, язык С, UNIX, Plan9 и других
Их предки написали Библию.
Добавил "go.gopath": "C:\\Users\\Dvach\\go\\pkg\\mod". Нахуя это гошное расширение впихивает src в путь? Модули же лежат в C:\Users\Dvach\go\pkg\mod
>. У меня есть общая директория, которая содержит вложенные директории с проектами
гоплс издавна не мог работать с проектами где несколько go.mod в разных папках. для этого https://go.dev/doc/tutorial/workspaces добавляли
Благодарю, работает. А нельзя как-то изменить $GOPATH/src на $GOPATH/pkg/mod? В \.vscode-oss\extensions\golang.go-0.38.0\dist\debugAdapter.js об этом что-то есть, но я не шарю в JS:
/
Given a remotePath, check whether the file path exists in $GOPATH.
This can be either in $GOPATH/pkg/mod or $GOPATH/src. If so, return that path.
remotePath can be something like /usr/local/gopath/src/hello-world/main.go
and relativeRemotePath should be hello-world/main.go. In other words,
relativeRemotePath is a relative version of remotePath starting
from the import path of the module.
*/
Платиновый вопрос - с нуля стоит вкатываться в голанг разработку? Хочу грузить жсоны. Вышки нет, так что вариант со стажировками в МЯСКОТЕ не подходит
>с нуля стоит вкатываться в голанг
>Вышки нет, так что вариант со стажировками в МЯСКОТЕ не подходит
Я молодой, шутливый, мне все легко
Отсутствием. Да, правда. Они гордятся всем, его у них нет. Вот дженерики теперь есть, и казалось бы, зрада зрадой, но есть повод для перемоги - нельзя вырабить обобщённый метод, неользя тип с констрейнтом мспольовать иначе, как в заголовке.
Хм R разве не аналог Python?
Го - простой язык без излишеств, что неясно?
Почему в языке, который расчитан на быстроту выполнения нет различных флагов оптимизации в ущерб скорости компиляции, как в других ЯПах?
Почему нет настроек гц уровня жабы и создатели сами решают это заместо тебя?
Понятно, что язык создавался что бы быть простым как палка, но погромисты не дауны же.
минимализм
Язык идеален. ЕМу не требуются флаги в нём ннайден оптимальный баланс по скорости компиляции, размеру бинарника и скорости работы кода.
Потому что еще одна цель языка - унификация. Это видно даже по тому, как он инфорсит стиль написания кода. В идеале одну и ту же задачу на Go можно решить одним способом и код при этом будет получаться максимально похожим, начиная с форматирования и заканчивая логикой. Всякие флаги добавляют непредсказуемости и возможностей накосячить.
Ты правильно заметил, что существуют другие языки, где эти возможности реализованы.
>Почему в языке, который расчитан на быстроту выполнения нет различных флагов оптимизации в ущерб скорости компиляции, как в других ЯПах?
Есть флаги отменяющие оптимизацию и инлайнинг, но по дефолту то что билдится оптимизированно
Я ж написал, что go get и go install не работают с этим пакетом.
>делаешь go mod tidy
У меня есть куча учебных однофайловых программ, которые требуют github.com/google/gopacket
Это ж придётся каждый раз go mod tidy вводить, почему так геморно сделано? Неужели нельзя один раз установить зависимость и при компиляции новых программ она будет автоматически обнаруживаться сборщиком?
>он автоматом скачивается в кеш покетов
А почему гошный сборщик в кэш не смотрит при последующих сборках? В чем смысл этого кэша, если сборщик не может найти уже "закэшированный" gopacket? Зачем на каждую однофайловую прогу вводить go mod tidy, пересоздавая кэш? Даже в устаревшем Си сделано более человечно, когда "кэш" автоматом ищется в стандартных директориях.
Если честно, впервые в такой ситуации.
Сделай форк и тяни от себя. Или сделай пул реквест, чтобы твои правки приняли в апстрим.
Бамп вопросу. Почитал чатики гоферов в телеге и выглядит так, что все пришли в го после работы на других языках
Для этого IDE придумали, свыня вимовская, там буквально все это за тебя делается
Буквально всегда, например при открытии файла, что бы можно было везде ретурнов совать и не бояться, что где то можешь забыть хендл прикрыть, применений уйма
Почему для разработки на этом ЯП нужна анальная фиксация на стороннем сервисе, которым владеет компания МАЙКРОСОФТ?
Че бля,оффсет,нахуя мне кафка партиция в виде структуры данных? Гошники вы ебанутые? Оправдывайтесь
мимо джава
Нахуярим сверху абстракций над самыми популярными кейсами и че,получим кастрированную джаву
А нахуя тебе копировать весь массив, у тебя память бесконечная что ли?
Тебя часто били в детстве об угол головой?
>несколько возвращаемых значений это сильно
Сильнее чем ты думаешь. Их не несколько, а одно множественное. Это такой неявный кортеж. В случаях, когда длина кортежа равна количеству пара Петров функции, можно этот кортеж передать в функцию. Или присвоить списку переменных, опять же, только такой длины.
А ты качай с серверов дядюшки Билли, который может тебе доступ обрубить, если ты ему не понравишься, кек.
Ну так обрубит, я буду качать через зеркала, которые сразу же изобретут, в чем проблема? Либо свой сервер опять же
Наоборот же. Неописуемый.
Аноны, а какие проблемы закрывают облака? У меня есть монолит на Го, покрыт тестами и в целом все вынесено по слоям, деплоюсь на вдске в докере, сам монолит + инфра, рпс маленький, это скорее сервис для небольшого количества людей, а написан на го, потому что приятно писать.
Все вроде норм, но дай думаю попробую себя в найме. собесился сразу на мидла, начали спрашивать за гугл клауд, я сказал что не знаю, он мне не был нужен, никаких моих проблем он не решал. Собственно, а какие проблемы он решает для небольших компаний ? Целюсь в именно такие, с штатом до 50 человек(но вообще таких очень мало хех)
@
ПРЕДВКУШАЕШЬ ОХУЕННЫЙ, МИНИМАЛИСТИЧНЫЙ КОД
@
ВЗЯЛИ НА ГОШНУЮ ГАЛЕРУ
@
ПИКРИЛ
@
ОБТЕКАЕШЬ
@
СОБЕСИШЬСЯ НА ПРЕЖНЕЕ МЕСТО
У вас там когда планируют внедрить нормальную обработку исключений?
Он минималитичный в смысле простой как камень, а не в смысле все можно в ванлайнер завернуть как в котлиине
У тебя и дженерики антипатерн лол
Serverless, деплой кучи микросервисов, только хуй знает почему это спрашивают у тебя, если ты я так понимаю не на девопса пошел, но тут думаю из за размеров команды им нужен человек-мультитул
Возможно ты прав, но это единственный собес за месяц, с работкой грустно, поэтому каждый провал довольно значителен в общем, было б это собес 1 раз в неделю то пох
>У вас там когда планируют внедрить нормальную обработку исключений?
А log.Println() тебе норм?
А че там у хохлов?
1. Маштабируемость: если у твоего приложения будет резкий рост нагрузки, можно достаточно легко иногда даже автоматически увеличить количество нод, дать больше памяти/процессора, БД, очередей.
2. Все необходимое есть из коробки: базы, очереди, кеши, мониторинг, логи, фаерволы, защита от DDoS, хранение секретов. И все это хорошо интегрировано, если следовать рекомендуемому пути все будет работать отлично.
Взамен ты получаешь конские цены, когда у приложения нагрузка вырастает до больших значений. И очень часто - вендор лок.
У меня свой git сервер я просто клоню нужные мне либы и всё работает.
Анончик у нас на работе artifactory кэширует все внешние зависимости и если Билли отрубит у нас ничего не наебнется
И кстати юзать module_name@latest не комильфо, тк никто не застрахован от кейса с node-ipc
он же с гитлабом и всякой хуйней тоже работает. остается вопрос у кого анальная фиксация
Это же насколько нужно быть тупым, что бы не понять этого? Твой стд бинд просто возвращает враппер, где строго говоря какие то аргументы уже забинжены и тебе не нужно их юзать, closures в go, как ты их называешь, это просто вызов функции, которая возвращает тебе функцию, внутри которой есть переменные из первого вызова
Понятно функция и переменные из скоупа внешней функции. А где такое может быть полезно на практике?
Ну йобанный в рот, да где угодно, почему тебе обязательно быть таким душнилой
А что, плюсы так до сих пор не умеют?!
там же, где [&](){}
вроде же решили добавить опциональную телеметрию или я чего-то не понял https://research.swtch.com/telemetry-opt-in
Которая включена по умолчанию и о которой тебе компилятор вежливо не скажет.
Шизик, ты чего или кого боишься?
Не удивлюсь, если ты пользуешься какой нибудь федорой или арчем, где бесконечное количество телеметрии лол
Язык не более чем инструмент. Если тебе предлагают Уже работу и тебе нравится язык, то почему нет?
Работу никто не предлагает, сижу в гэпе пока. Просто весь опыт джавы это круды на спринге + кубер. Про инструмент - золотые слова, но вот хотелось бы подтянуть фундаменталс с чистого листа на новом стеке.
>>686935
Кажется джава очень громоздка в плане инфраструктуры, хочется просто кодить и решать кодерские задачки, а не пердолиться с зависимостями, фреймворками, сборщиками и т.д. Ну и 90% задач - круды шаблонные.
Отвечу, что если у вас принят такой кодстайл, мы не сработаемся
Как правило err != nil, потому что за этим обычно следует вывод ошибки в лог и ретурн/передача управления в другую функцию. В противном случае будут появляться else, вложенные ифы или просто вся логика будет внутри большого ифа. это если вопрос был серьезный, а не насмешка над типичным гошным бойлерплейтом
можно как нибудь так
var (
ErrPasswordNotFound = errors.New("password not found")
ErrPasswordExists = errors.New("password already exists")
)
func handleError(err error) {
if err != nil {
fmt.Println("Error:", err)
os.Exit(1)
}
}
а хотя нет
>go: all: malformed module path "sync/atomic": missing dot in first path element
(для всех зависимостей)
Вообще чет сильно испоганили работу с зависимостями, в 2017 такого не было, можно было просто кодить, сейчас какой-то пиздец. Естественно в go.mod я добавил путь с гитхабом.
Мне вообще люто доставляет подход к ошибкам в гошечке, после питухона, когда любая внешняя хуйня может выкинуть исключение и ты узнаешь что она выкидывает исключения только когда это случится или проштудировав код/документацию. Охуенная идея насильно заставить обрабатывать все ошибки и похуй на пару дополнительных строчек кода.
Гошка простая, нет никакого смысла идти в джуны, если есть опыт программирования уже.
С джавы однозначно да. Сама по себе жаба неплохой язык, но те подходы и инструменты, которые популярны в ее сообществе - делают разработку на жабе полнейшим говном. Причем нелепым и кринжовым прям, если у тебя есть опыт в других экосистемах. Да и сами адепты джавы, зачастую, довольно туповатые и ограниченные, особенно спринганы.
Мимо 12 лет в ИТ, рулил проектами на nodejs, go, java/spring, python
Какие мантры? Гошка очень топорная и простетская, это и была одна из целей создания.
Scala, Idris, Rust, F# да дохера их.
И C# ровно в 2000-м.
Так панику в го у тебя никто не отменял, плюс этих "дополнительных строчек" настолько много, что ты далеко не всегда можешь сказать какие ошибки вернёт твоя функция.
Шиз, ее никто не использует, разве что редкие перекатуны из джавы или шарпов, это ебейший пиздец такое использовать
Там она может сама случиться, хочешь ли этого ты или автор внешней либы, банальный доступ по несуществующему индексу.
>когда любая внешняя хуйня может выкинуть исключение и ты узнаешь что она выкидывает исключения только когда это случится или проштудировав код/документацию
По этому кейсу, ты все равно должен штудировать сорцы/документацию, что бы знать какой из сотни видов ошибок у тебя прокинется выше и навесить на его обработку какую-то логику.
> что бы знать какой из сотни видов ошибок у тебя прокинется выше и навесить на его обработку какую-то логику.
Ты же понимаешь что в 98% случаев тебе не нужно по особенному обрабатывать каждую ошибку? Максимум - выкинуть 500 статус код и в боди саму ошибку
А в остальных 2% ты уже наверняка знаешь какую конкре но ошибку тебе нужно обрабатывать отдельно
> банальный доступ по несуществующему индексу.
Если у тебя есть такая проблема, то тебе ни один язык не поможет, ты везде будешь тупым
>Максимум - выкинуть 500 статус код и в боди саму ошибку
Если у тебя такая обработка ошибок, то в случае с try catch никакой проблемы тоже нет, оборачиваешь реквест в него, пользователю 500, в логи стектрейс.
>Если у тебя есть такая проблема, то тебе ни один язык не поможет, ты везде будешь тупым
А ты уже проштудировал сорцы внешних либ и убедился, что такого точно не будет блябуду?
Мистер блябуду, ты же знаешь, что в го не используют миллиард библиотек и всякие спринги?
В го для джавистов специально есть аналог твоего try/catch, recovery() зовется, но это ебейший антипаттерн
Паника это любая необрабатываемая ошибка, которая может случиться во время выполнения программы, что бы ее получить не обязательно, что бы ее кто-то явно кидал.
Ну да, каждый день же делишь на 0 и индексируешь элемент больше капасити у слайсов, голову лечи
Потому что те кто делают дейтвительно большие приложения не кричат, что recover это антипаттерн
https://github.com/gin-gonic/gin/blob/master/recovery.go#L58
Тут дело в значимости, авторы gin понимают, что паника может случиться где угодно и спокойно юзают recover, а неофиты начали вторить евангелистам и объявили весьма полезную функциональность антипаттерном
Попробуй отведать ради интереса систему типов из f#, а лучше из ocaml с его алгебраическими типами, Polymorphic variants и.т.д. Потом больше ничего не захочешь.
>Есть аналог твоего try/catch, recovery() зовется, но это ебейший антипаттерн
А нахуй тогда это есть в языке, если это такой пиздецкий антипатерн? Он же вроде простой и в нём нет ничего лишнего.
Та не... гошка довольно касая, топорная, а местами откровенно всратая. Просто менйстрим и промышленное разработка, скажем так, это про выбор меньшего из зол и уворачивания от костылей, который летят тебе в лоб, от создателей различных инструментов.
Просто исторически сложилось, что простой, производительный зяык, с грин-тредами и CSP - это го, лучше пока ничего нет.
на самом деле crystal (https://crystal-lang.org/) куда лучше и органичнее, как язык. но оно нихуя не популярно и имеет беды с кросс-копиляцией
Что бы джависты и дальше могли делить на нуль и индексировать несуществующую память
Ты что, gin это же почти спринг, а на го только велосипедостроение, только хардкор!
Ты что-то перепутал. Это гоферы никак, то есть вообще никак, не могут защититься от разыменования нила.
Поставь эту галку и узнаешь.
Представляю как тянучка ищет вакансию го-го танцовщицы, а хх ей засирает результаты поиска говолангами....
Как (и можно ли вообще) на го написать функцию, которая будет принимать в качестве параметра переменную типа A или B и выполнять операции над значением поля Foo независимо от типа структуры и чтобы написать метод один раз, а не для каждого типа отдельно?
Чтобы получить выдачу без мусора поиск настрой по названию вакансии
Go or golang
Но и там попадается мусор типа Яндекс.Go и Go-go танцовщицы
То что в других языках норма, в гошечке уродство... Но да, с дженериками он проклянёт все на свете.
Только вот почти всегда ветка err!=nil заканчивается return. Это ли не признак того, что
>продолжать не нужно или просто невозможно
?
А если нужно отменить коммит? Но одна из ошибок произошла еще до создания коммита
Это он скорее всего про всю программу в целом, а не про отдельную функцию
Он коммитом назвал транзакцию.
И что? Ты к тому, что роллбек надо делать сейчас, а не выше? Ну сделай, и выбрось с чистой совестью панику, здесь делать больше нечего, и в пределах 3х уровней выше тоже скорее всего нечего.
https://github.com/golang/go/issues/60078
Аноны, а зочем Роб Пайк и Кен Томпсон добавили возможность с декларировать на любом языке?? Чтобы студентам из России было проще??
Чтобы 1с-никам было проще перекатываться.
480x360, 0:13
На сколько я знаю с 1.18(вроде) гарантируется, что ни одна горутина не будет занимать системный поток бесконечно.
В случае, когда есть свободные потоки, я понимаю как они могут прервать выполнение другой горутины. Но если все потоки будут заняты и не будут совершать действий вызывающие планировщик, что происходит в этом случае?
>документации во всем стеке
Это какой? Который буквально пару роутеров имеющие в себе полторы функции и грпц в котором тоже пару функций, и те генерируются сами?
так вот а ктож его создаёт если все потоки заняты?
не могут. один каталог - один пакет. Можно делать подкаталоги с другими пакетами.
Чтобы Deutsche Pidoraßen могли писать на родном языке.
Пиздец, я только по ответам анонов понял, о каких языках вопрос.
Спасибо, Анон. Наверное очевидно, но я не рефлексировал, пока ChatGpt не сгенерировал такой код и возможно детская травма от чтения книжек по borland c
>В случае, когда есть свободные потоки, я понимаю как они могут прервать выполнение другой горутины. Но если все потоки будут заняты и не будут совершать действий вызывающие планировщик, что происходит в этом случае?
отправкой сигнала занимается sysmon тред, а не треды, которые твои горутины с твоим кодом крутят
спасибо брат.
Я так понимаю этот поток никак с шедулингом не связан?
И можно как-то через dlv на рантайм смотреть?
Допустимо-ли клепать приложения без применения подкаталогов с другими пакетами? Т.е. раскидать код на несколько файлов в одном каталоге, относящихся к package main. Вижу некоторую трудность в выяснении источника функции, т.к. в едином пакете нет вызова типа: hui.Droch(), а сразу Droch() непонятно откуда. Насколько это будет/не будет считаться говнокодом? Мне не нравится куча подкаталогов, которые надо раскрывать.
Да, конечно, многие крупные и уважаемые проекты так и склепаны. Sarama, например.
В любом случае код на го не может быть нормально организован из-за предельно всратой системы модулей и управления зависмостями.
Поэтому просто пиши как тебе меньше страдается.
>Вижу некоторую трудность в выяснении источника функции, т.к. в едином пакете нет вызова типа: hui.Droch(), а сразу Droch() непонятно откуда
из того же пакета main, понятно же
>Допустимо-ли клепать приложения без применения подкаталогов с другими пакетами
ну допустимо. но это зависит от объема и обычно так не принято. на практике ты можешь притвориться сишником и писать префиксы без точки у каждой функции/типа, но тебя захуесосят. мне как стажеру в первый день говорили вот если хочеш напиши сначала в одном пакете, потом разобьеш)))))))))))))
>C IDE оно конечно понятно через ctrl, а в иных ситуациях придётся кучу файлов пакета в поисках дрочи перерыть.
да ладно тебе слыш, у тебя один пакет, в котором может может быть одна функция с таким названием, оверлодинга же нет
Ничего против вима не имею, но что именно он умеет, чего не умеет вскод а то может стоит изучить.
По факту 99% того, что мне требуется - это ctrl+click и переименование символов по f2, но то я. Интересно, какие еще есть реально полезные фишки.
> IDE денег стоит и в рашке не продаются.
Ну, давай разберём по пунктам тобою написанное.
1. "Денег стоит". То есть ты, высококвалифицированный айти-специалист, не можешь заработать себе на инструмент?
2. "Не продаётся в РФ". Читать как "я, высококвалифицированный айти-специалист, настолько туп, что не могу осилить обход формальных ограничений".
> IDE денег стоит
Так сразу бы сказал, что ты не просто позер, так еще и школьник-позер. Поэтому тут да, хелловорлды писать иде не нужна
даже капча считает тебя псевдопрограммистом
Стоит как минимум попробовать vim-mode, вроде как для вскода он был. Основная фишка как бы в этом. Как редактор вим изкоробки не умеет ничего. Есть есть желание подучить lua, и пару тройку вечеров чтобы сделать себе конфиг то вперед. Однако поебавшись и настроив все мы получаем редактор уровня vscode с консольным ui. В конечно счете за несколько лет использования ты настолько сильно врастаешь в этот вим, что его хочется буквально везде, и любое редактирование текста ты себе иначе уже не видишь. Что касательно пользы то как бы удивительно это не звучало то это экономия время не редактирование текста. Да, ты тратишь время на конфиг, но компенсируешь его когда освоишь редактор хотя бы через месяц-два использования. Кроме того вим не вешает 32гб машину с запущенными фоном 8-ю gopls, докерами и прочей хуетой.
>>697367
Использование IDE для го в принципе никак не обоснованно. Кроме, разве что, фантазий про серьезных программистов купивших себе goland. Скажу больше, если забрать у тебя все эти удобные кнопки которые тебе дает IDE, и без которых ты ничего не можешь, то грош тебе цена как программисту. Не можешь сам автоматизировать и настроить свое рабочее окружение - идешь нахуй, ты не программист.
> Использование IDE для го в принципе никак не обоснованно.
> все эти удобные кнопки которые тебе дает IDE
)))))))))))
> и настроить свое рабочее окружение
Кто то мешает настроить иде? Настраивай как хочешь, хоть шорткаты вима накати, плагинов на это миллиард и больше
Найди работу, долбаеб
>ничем не обосновано
>РРРЯЯЯЯЯ НИНУЖНА
А твой вим изкаропки такое имеет без пердолинга? И это только одна миллионая всех возможностей
https://imgur.com/a/oeDsuUi
Это некоем образом не причина использовать IDE, это может быть поводом но никак не причиной. Тем более говорить что только тру программисты выбирают IDE. Иш какой сурьезный, сидит там в IDE. У тебя риторика уровня, не хочу ебаться с настройкой потому что я дохуя занятой. При этом проебывая время в треде и споря с каком-то рандомным челом. Настроить можно все что угодно и как угодно. И код ты можешь писать где хочешь. Ничто из этого не делает тебя программистом лучше или хуже. Поэтому заканчивай свою хуйню с вешанием ярлыков. Есть у меня работа, и вим мне в ней очень помогает.
Сразу отвечу, что и в моем понимании человек использующий vim никоем образом программистом лучше вас сидящих в IDE не является. Я говорил только о знаниях и возможностях, и наверное даже скорее понимании того как настроить своей рабочее окружение. Если ты не можешь сделать этого сам, то ты не понимаешь как это работает. А значит что ты макака которую можно легко заменить такой же макакой которая будет нажимать удобные кнопки в IDE и рассказывать про трушность и серьезность программистов.
>sudo apt install vim
>ДА НИ МАКАКА Я НИ МАКАКА ЭТО ВЫ МАКАКИ ЗАПУСТИЛИ СВОИ ВСЯКИЕ .EXE .DMG
>конфигурация посредством редактирования .yaml / .lua / whatever else
> VS конфигурация нормальным UI и плагинами в одну кнопку с маркетплайся
>РЯЯЯЯЯ МАКАКИ КНОПКОДАВЫ НИЧЕГО НЕ СТОИТЕ РЯЯЯЯЯ ВИМ СЛОЖНАААА
>Если ты не можешь сделать этого сам, то ты не понимаешь как это работает
Может еще свой менеджер тредов, процессов и памяти написать? А то хули, как ты им пользуешься сам не реализовывал.
Ты бросаешься из крайностей в крайности. Если тебе нужно понимать как работают эти вещи в твоей рабочей повседневной деятельности, то да, это хороший способ понять что это такое. Квинтэссенция программирование про автоматизацию процесса, в данном случае разработки.
Для школоты-студентоты жидбрейнс бесплатный, кстати.
>Квинтэссенция программирование про автоматизацию процесса, в данном случае разработки
Программирование это про перевод бизнес-требований или личных хотелок в код, а не твоя шиза про настоящих программистов.
> Ты бросаешься из крайностей в крайности.
Так а нахуя мне тогда понимать как работает ебанная IDE? И самое главное не нахуя, а ЧТО ПОНИМАТЬ, что ты в ней собрался понимать? Вот скажи блять, ЧТО В НЕЙ ПОНИМАТЬ
Я понимаю как работает язык и нужные мне библиотеки. НО ЧТО Я БЛЯТЬ ДОЛЖЕН ПОНИМАТЬ В ЕБАННОМ РЕДАКТОРЕ, ЧТО БУКОВКИ ВСТАВЛЯЮТСЯ ПРИ НАЖАТИИ?
Ебать ты МЫШЕВОЗ, поди ещё и на винде сидишь или каком-нибудь богомерзком DE без тайлинга.
> поди ещё и на винде сидишь
Предпочитаю пользоваться удобной системой без проблем, а что? В разработке она не нужна, голенг умеет в кроссплатформу
ожидаю выпуки про драйвер постгре
На случай высера про --race отвечу сразу пикрилом, докер.
Это и есть автоматизация. Берешь идею - автоматизируешь процесс.
>>697425
Ты несколько уводишь наш разговор от темы. Я говорил не об этом и имел ввиду совсем не это. Ты, или это был не ты, неважно. Тот анон что выше, его основная логика, что все крутые и серьезные программисты используют IDE. Моя же логика не в том, что все программисты использующие vim по настоящему крутые и куда лучше вас бездарей из IDE. Моя логика что если ты вешаешь ярлыки по тому что использует человек, при этом сам не вдаешься в технические вопросы того что ты повседневно делаешь, то ты просто долбаеб, вот и все.
>Это и есть автоматизация. Берешь идею - автоматизируешь процесс.
Если это лично тебе нравится или это требования работадателя, то да. Если нет, то это не стоит твоего времени.
> того что ты повседневно делаешь
Я пишу бизнес-логику, а не IDE, помешанный вимошвайнокарась
> если ты вешаешь ярлыки по тому что использует человек
Увы, но так показывает практика, 99% вимошизиков - пишут на уровне хелло ворлдов
Не смеши. Ты еще скажи, что ты можешь по коду определить был ли он написан в профессиональной IDE, или в плебейском виме.
> ты можешь по коду определить
В теории можно, IDE обычно сама сортирует импорты и заводит go fmt, но это так, косвенные
Ну это уже шутки какие-то несерьезные пошли. Даже неуважение какое-то, ей богу. Ты судя по всему дальше :q в вим не заходил.
Дебаггер тебе я так понял нинужын.
Смысл в идее и ее потомках - то что там нормально сделан дебаг для любого официально поддерживаемого языка.
Видели мы ваши дебаггеры и функционал, спасибо ненадо, лучше уж совсем без него, чем с ЭТИМ
Ты сутки искал плагины? Красава, а теперь найди работу. В голенде такое изкаропки
Когда начал учить го, потратил минут 30 чтобы установить vim-go. Было безумно сложно дописать в конфиг пару строк, но я каким-то чудом справился.
Камитишь блять пушишь и все равно, твои изменения не видны, несмотря на то что ты импортируешь библиотеку уже из своего репозитория. Версии какие-то, ну нахуй это надо, почему нельзя просто брать последнюю версию из мастер бранча?
Если торопишься - vscode или его открытый форк. Не ебись с вимом, учи язык. Потом когда будешь синьером-помидором хуи пинать, можно и вим позадрачивать.
Если по фану - то конечно neovim, сначала будет непривычно, потом сложно, но в какой-то момент ты поймешь, что получил охуенный инструмент, которым будешь пользоваться всю жизнь.
>получил охуенный инструмент, которым будешь пользоваться всю жизнь пока не перейдешь на emacs с evil-mode
Пофиксил
> Версии какие-то, ну нахуй это надо, почему нельзя просто брать последнюю версию из мастер бранча?
Представь, как тысячи проектов одновременно перестали собираться из-за того, что в последней версии популярной либы сломали обратную совместимость.
Да меня тоже все это бесит, но без этого никак. Git нужно изучать в обязательном порядке, без него уже хелло вёрлд наверное ни на одном языке не написать, кроме QBasic.
Все это сделано максимально неудобно, но если разобраться, то понимаешь, почему без этого какая-то серьезная разработка невозможна.
Зато вот разберешься с goreleaser и будет у тебя страница с релизами как у взрослых проектов :)
>импортировал из пакета А в пакет Б
>теперь ты не можешь импортировать из пакета Б в пакет А
Как же меня заебали эти импортопроблемы. Они специально такую конченную систему выдумали?
Я так понимаю, других языков ты не видел? Такое везде.
> Все это сделано максимально неудобно
git commit команду наверное пиздец сложно выучить. Удобнее ничего нету, почему тебе неудобно - хуй знает. Оно сейчас идеально и максимально удобно, можешь хоть по-коммитно подгружать нужную версию и не ебать мозгу
ну выучи основную хуйню - как гц/шедулер/интерфейсы/каналы/мапы/слайсы работают, потом на собес. всё.
Настоящие программисты пишут хуй на заборе
Но это реально для полных даунов книга.
https://coderbooks.ru/books/go/head_first_izuchaem_go_2020_makgavren/
>А умом ты не блещешь, да?
я из джавы к вам пришел, там обмазываться книжечками это норма.
У вас че, не так что ли?
Я открыл эту ссылку на туториал, но мне кажется этого мало для понимания полноценного.
>>706246
хеад ферст сразу нахуй, я их книги не рассматриваю в принципе ни в каком языке - технологии.
нашел какую-то
нашел какую-то Адам Фриман Профессиональный Go. Вроде объем неплохой, пока читаю но складывается впечатление что писал инфобизнесмен какой-то ебаный.
алсо, ну если знаешь какие-то годные видеокурсы то советуй.
Если у тебя норм опыт в джаве, то достаточно пробежать по материалам в шапке. Потом практика и гугли/читай доки по сложным для тебя моментам. Талмуты на 1000 страниц тут нахуй не нужны, гошечка мега простая, когда есть опыт.
производственного опыта нет, спринг потыкал, петпроектики немного, алгоритмы там и все такое. Ну естессно задрачивал талмуды про одно и тоже
пока смущают немного срезы. Нахуя навыдумывали какую-то хуйню с привязкой к массивам, ебота какая-то (я конешн понимаю что из под капота в джаве динамические коллекции тоже работают (некоторые, не все) с массивами, но это как-то перебор), а так же из коробки передача по значению абсолютно всего нахуй.
Пока-что по ощущению это анти-джава какая-то получается.
Го сильно низкоуровневый по сравнению с джавой. Это скорее хипстерский Си, в котором улучшили качество жизни и отобрали возможность стрелять себе по ногам.
Все максимально топорно и просто, никакой магии. Cлайс - фактически тот же динамический массив из джава.
В джаве тоже абсолютно все передается по значению, как и в го. Вот только в некоторых случаях переменные под капотом содержат указатели на значения, а не сами значения.
В го со слайсами такая же история, слайс - это по сути указатель на массив и когда ты передаешь слайс в функцию, ты по сути передаешь указатель. Если же тебе в го надо передать структуру, которую ты хочешь там поменять, нужно явно указать, что ты передаешь именно указатель на структуру, а не копию
Потому что ты скорее всего джавист, тут другая парадигма, синтаксис заебись, if err != nil тоже нормальный, что тебе не нравится? Удобные функции, интерфейсы и вообще подход. Заебись.
То, что заставляют на каждый пук писать доку это как плюс, так и минус, как смотреть. Но вроде бы это отключается
Язык охуенный, жаль, я не сениор и работу на нем не могу в польше найти. Если у вас есть вакансия на Go , готов работать вместо тебя, лишь бы не на жабе и прочем дерьмо ООП
"An array type T may not have an element of type T, or of a type containing T as a component, directly or indirectly, if those containing types are only array or struct types."
// invalid array types
type (
T1 [10]T1 // element type of T1 is T1
T2 [10]struct{ f T2 } // T2 contains T2 as component of a struct
T3 [10]T4 // T3 contains T3 as component of a struct in T4
T4 struct{ f T3 } // T4 contains T4 as component of array T3 in a struct
)
// valid array types
type (
T5 [10]T5 // T5 contains T5 as component of a pointer
T6 [10]func() T6 // T6 contains T6 as component of a function type
T7 [10]struct{ f []T7 } // T7 contains T7 as component of a slice in a struct
)
Что здесь вообще подразумевается?
>An array type T may not have an element of type T
Или как в реальном коде можно записать такой тип T5 [10]T5?
Сейчас с джунами в целом неоче. Если у тебя нет опыта в айтишечке, я бы на твоем месте поискал вакансию линейного сотрудника в крупную средне-контору в эксплуатацию или админить тестовые стенды например, либо автотестирование. Пару лет там, параллельно практикуя го и осваивая все сопутствующее беку. Потом в разы проще будет найти нормальную работу. Можно будет перекатиться или сразу в разработку или к девопсам на пару лет еще пойти и оттуда уже в разрабы-мидлы точно заскочишь.
>// invalid array types
рекурсивные типы. аналогично тому, как структ типа T не может иметь внутри член с типом T, только член-поинтер на T.
>T1 [10]T1 // element type of T1 is T1
нельзя сделать тип, который является массивом самого себя
>T2 [10]struct{ f T2 } // T2 contains T2 as component of a struct
нельзя сделать тип-массив, элемент которого содержит в себе сам этот тип-массив
>T3 [10]T4 // T3 contains T3 as component of a struct in T4
>T4 struct{ f T3 } // T4 contains T4 as component of array T3 in a struct
аналогично предыдущему, только Т4 теперь не литерал, а именнованный тип
>Потому что ты скорее всего джавист, тут другая парадигма, синтаксис заебись, if err != nil тоже нормальный, что тебе не нравится?
То что в 99% случаев err просто возвращается наверх. Но ты вынужден пердолиться с возвратом этого значения вручную. Например есть функция которая получает запрос, валидирует его, процессит и сохраняет в базу.
На Джава
Response process(Request r) {
validate(r);
var response = processR(r);
save(response);
return response;
}
На Го
func process(r Request) (Response, err) {
err := validate(r)
if err != nil {
return nil, err
}
response, err := processR(r)
if err != nil {
return nil, err
}
err = save(r)
if err != nil {
return nil, err
}
return response, nil
}
Я понимаю почему это сделали, если у тебя функции не раскрашены, то сделать так чтобы эксепшен не пропал, а был правильно обработан, становится очень нетривиальной задачей. Но это сильно засирает обычный код. А все горутины остаются в фреймворке. В результате ты пишешь без горотин, но с if err != nil {
>Потому что ты скорее всего джавист, тут другая парадигма, синтаксис заебись, if err != nil тоже нормальный, что тебе не нравится?
То что в 99% случаев err просто возвращается наверх. Но ты вынужден пердолиться с возвратом этого значения вручную. Например есть функция которая получает запрос, валидирует его, процессит и сохраняет в базу.
На Джава
Response process(Request r) {
validate(r);
var response = processR(r);
save(response);
return response;
}
На Го
func process(r Request) (Response, err) {
err := validate(r)
if err != nil {
return nil, err
}
response, err := processR(r)
if err != nil {
return nil, err
}
err = save(r)
if err != nil {
return nil, err
}
return response, nil
}
Я понимаю почему это сделали, если у тебя функции не раскрашены, то сделать так чтобы эксепшен не пропал, а был правильно обработан, становится очень нетривиальной задачей. Но это сильно засирает обычный код. А все горутины остаются в фреймворке. В результате ты пишешь без горотин, но с if err != nil {
>На Джава
по коду не понятно какие из функций проникнут эксепшном в жопу. весь код теперь в try catch оборачивать что ли?
>по коду не понятно какие из функций проникнут эксепшном в жопу. весь код теперь в try catch оборачивать что ли?
Технически у тебя любая функция может сломаться на null/nil и тысяче других вещей. Только в Java у тебя будет NPE который поймает фреймворк наверху, а в Go panic.
>Читаем документацию прямо по порядку (пункт "Learning Go"): https://go.dev/doc/
Сейчас там не такого пункта, подразумевается "Using and understanding Go"?
Это троллинг тупостью, да?
Первый пост как раз и и был про If err != nil
Плюс, чтобы вернуть err в случае nil ссылки надо не забыть её проверить на nil, без этого будет паника.
>Выгоняют из дома, есть 10 недель найти работу в айти.
>
>Дайте совет/план. Джаву и ДЖСкрипт могу начать учить сейчас же?
бамп
5 недель язык
5 недель - 5 пет продежков
Нет?
42 урока
по 1 в день че, нельзя? лол, да по 3-5 в день
https://www.practical-go-lessons.com/
Вот тут гайды подробнее
https://go.dev/learn/
м
Пиздуй курой в самокат, у тебя 0 шансов, если нет айти вышки и предыдущего опыта. Если есть, то целый 1%, если ты умный дохуя, в чем я сильно сомневаюсь. Рынок сейчас перенасыщен пидорнутыми джунами с уже существующим коммерческим опытом, а в голанге джуны не нужны в природе.
я в Европе буду искать работу. Или Китае. Или Индии. Рынок в 1.5 млрд + 1.5 млрд, щас бы в РФ тухнуть за 2000 баксов
чел, не дизмораль
> Плюс, чтобы вернуть err в случае nil ссылки надо не забыть её проверить на nil, без этого будет паника.
Ты троллишь тупостью или как? Функция, которая возвращает саму эту ссылку тебе вернет еще и еррор, если у нее где то там внутри случился проеб, это не тебе надо проверять указатель на существование
Современная разработка это не про то, что ты знаешь как писать if-else-for и даже отличаешь класс от метода. Тебе нужно знать еще десяток-другой обязательных сопутствующих технологий и инструментов (гит, линупс, хттп, жесон, ямл, шифрование, бд, тестирование и еще куча всякой мелочи) и быть готовым разобраться с еще десятком специфичных для компании. Добавь сверху еще хотя бы поверхностное знание технологии разработки, гитфлоу, аджаил вот это вот все + знание типовых паттернов разработки и архитектуры, чистый код и прочую хуйню. Это для джуна. Для мидла надо уметь всем этим пользоваться хотя бы на уровне погуглил и за 5-10 минут сам понял как правильно и хорошо сделать.
Язык за пять недель - это ок, но все это говно вокруг языка вытянуть самому за месяц-два очень маловероятно. Как выше писали, надрочить линукс и поискать работу рядовым дежурным сисадмином - шансов на несколько порядков больше.
>Функция, которая возвращает саму эту ссылку тебе вернет еще и еррор, если у нее где то там внутри случился проеб, это не тебе надо проверять указатель на существование
Сам придумал какую-то хрень, сам на неё ответил. Речь шла о том что в функцию попадает nil значение которое раньше всегда было not nil. Вот тут и может быть паника.
Каким хуем туда попадёт нил значение? Если ты ошибки игнорить будешь, то так то да, но иначе я представить не могу как можно передать блять нил, что у тебя должно быть в голове? Сделать &var и получить нил ну уж точно не выйдет
Не перегибай, для джуниора как раз достаточно знать язык, включаю стандартную библиотеку, уметь мерджить ветки в гите и писать запросики к бд + хоть какой-нибудь кругозор. Все остальное специфично для конкретного проекта. Насчет общих знаний по паттернам и архитектуре - для этого есть мидлы и сеньоры. Другой вопрос, что компаний готовых растить нулевых джунов не так много, поэтому спрос на мидлов естественно больше. Челику можнт быть имеет смысл вкатываться на оплачиваемые стажировки в крупные компании, если не тупой, то предложат джуном поработать.
> Другой вопрос, что компаний готовых растить нулевых джунов не так много
Согласился бы с тобой года два назад. Но за последний год каждая компания, которую я знаю разумеется включая мою посокращала кучу людей и разумеется это были в первую очередь джуны. Если я буду рассматривать себе в команду пополнение, в первую очередь я возьму джуна с уже существующим коммерческим опытом, а не вчерашнего студента (ну разве что он будет готов работать за дошираки). Благо сейчас есть из чего выбирать. Программы стажировок - отличная тема, сам так вкатывался, но опять же это было бля давно, задолго до СВО.
Первый же коммент
>Every goroutine starts with 2KiB of pre-allocated stack, so one million goroutines consume around 2GB (2,048 * 1,000,000 bytes).
Там и у питона соснули, чо уж
ваще пох, виртуальная память и оверкоммит
Если я разрабатываю некоторый модуль и выставляю его api через интерфейсы, а реализацию скрываю в кишочках модуля, его могут использовать клиенты? Как в этом случае они будут получать конкретную реализацию?
Спасибо, еще вопрос появился - насколько низкоуровневая разработка на гошке? В том смысле, что насколько много приходится изобретать велосипедов и писать инфраструктурный функционал под свои задачи (начиная от пресловутых реализаций структур даных, заканчивая клиентами для месседж брокеров и пулом коннектов к БД)
Какие нужные знания в целом по cs, чтобы жопа не горела?
мими-крудошлеп
>объявлять интерфейсы там, где собираешься их использовать
А потом наеьнуттся об циклические зависимости.
Разрешаю. Надрочи руку на каком-нибудь пете да сходи на собес, хуле как маленький.
Первый мой свич языка, трясуся
мб ты про методы с поинтер ресиверами? чтобы их вызвать нужно адресуемое значение (ну так как нельзя получить поинтер на неадресуемое значение)))
https://go.dev/play/p/45b_ZMmVBMP
Если результат функции никуда не передавать, то не работает.
Не совсем понятно, почему вернувшийся указатель из one() у компилятора подозрений не вызывает, хотя по сути значение тоже теряется и не используется. В общем адресуемость - мутное определение для меня
>>717728
https://go.dev/play/p/oJPDl4OTwMs
Не, смотри выше. Поинтресивером может быть переменная-значение, если она адресуемая. (компилятор сам возьмет адрес). Как понимаю, только если методы интерфейса имплементить для поинтер ресивера, то компилятор ругнется, при попытке положить в переменную-интерфейс само значение, а не указатель.
Потому что результат функции не addredsable. Почему в каких-нибудь плюсах это работает, а в го нет - потому что плюсы это сложный и замороченный язык, а го - простой и понятный.
Что не ясно?
addressable. Нечто, у чего можно взять адрес. В сях, впрочем, помнится, тоже нельзя было возвращать указатель на локальную переменную
Здесь можно, но его следует приземлить перед использованием.
В общем, дети, сол и фасол пишутся с мягким знаком, а вилька т тарелка - без
Это понять нельзя, это надо запомнить.
т.е. притвориться, что еслти возвращается указатель, то это указатель на результат функции (указатель сам по себе addresable)
>нельзя было возвращать указатель на локальную переменную
>Здесь можно.
Становится понятно, что утверждение "Го учится за пару вечеров" не более чем рофл.
Хз как можно догадаться про утерждение выше, хоть и прочитал спеку и effective go
Потому что результат выполнения функции - это rvalue. То есть подразумевается, что это временный объект который неизвестно где размещен, может быть в регистрах, может быть в стеке или в куче. С указателем прокатывает, потому что это уже и есть адрес по которому можно сходить.
Вот хороший видос по теме. Там хоть и плюсы, но эти концепции универсальные для всех языков. https://www.youtube.com/watch?v=XS2JddPq7GQ
Дело как раз в том, что с увкащатеоем НЕ прокатывает. Пока ты его не засунешь во внешнюю переменную.
>нельзя было возвращать указатель на локальную переменную
>Здесь можно.
> Становится понятно, что утверждение "Го учится за пару вечеров" не более чем рофл.
всмысле? тут просто убран кейс, на котором валятся новички в сишке. ну люди без знания сишечки о нём даже знать не будут.
Ну вот же ты сам делал пример.
one - указатель на структуру - компилятору норм, rvalue - это адрес по которому есть это поле, ошибки нет.
two - структура - компилятор негодует, неадресуемое rvalue, которое хуй знает где, проверить есть ли у него поле он не может, потому что нет адреса где живет эта ебола
А для rwo() при этом эфемерная копия значения, тут же исчезающая, имеет адрес и а нее можно положить значение.
В общем, классическая сол и фасол.
Это защита от вкатунов-долбаебов, указатель еще логично менять, но нахуя менять тебя копию - уже интересный вопрос
Или это прямо терминальный корнер кейс, который на практике не встречается
перед тем как вкатываться научись программировать епта. у нас тут на сеньоров приходят собеситься всякие контекст заюзать не могут
редко. в редких случаях, когда ты встречаешься с тем, что у тебя что-то не аддрессабл, то в первую очередь загорается жопа LSP, потом тебе IDE красно красным светит на весь дом, что так делать нельзя и ты пишешь еще строчку, чтобы сохранить залупу в переменную. тут буквально одна редкая проблема с одним самым простым решением.
а вот nil разыменовать получается намного чаще. обычно выливается в то страдание, что тебя на PR просят добавить проверку на nil. ну или прод начинает пятисотить, но это реже.
Кто-нибудь пишет опенсорс проект? Или может стартап? Готов бесплатно или почти бесплатно(если вы все же зарабатываете деньги с проекта), писать код на Go,
опыт коммерческой разработки - 3 года, писал всякое разное на питухоне, начиная от крудов на джанге, заканчивая простыми ML моделями для бизнеса(деревья решений, классификация), потом упоролся в низкий уровень, компуктер сайнс. Поскольку работу найти де факто невозможно, если не из РФ(т.е озон, вб, сбер отпадают), нужно поддерживать скилл.
Пишите
Может телегу сразу дашь? Есть один пет проект, опишу, интересно тебе будет или нет
Что делают вместо дефолтных аргументов и опциональных значений (и как отличать опциональные значения от отсутствующего если делать через неприсвоенную переменную), как справиться с вездесущим if err != nil и т.д.
В общем, где можно посмотреть идеальный код со множеством кейсов где все разложено по полочкам с объяснениями, может даже книжка/статья найдется.
>дефолтных аргументов и опциональных значений
https://go.dev/play/p/ua84ZSOSL70, но это как-то уродски
>if err != nil
в effective go есть пример https://go.dev/doc/effective_go#recover, где можно обыграть внутри своего пакета отлов ошибок на верхнем уровне. Если ошибка кастомная, то обрабатываем, если нет, то паникуем.
В ГО есть что-то подобное или нужно только вокрун каналов, вейт груп и селектов плясать?
А чем тебя не устроили чаннелы, вг и селекты? Они буквально для этого и создавались, шиз
Ну тогда обмажься враппером вокруг них, лол
Зачем от них избавляться? Если функция может вернуть ошибку, то естественно что ее нужно обработать. Если тебе похуй то можно использовать _ и не проверять ничего.
Алсо, очень удобно оборачивать ошибки на каждом уровне через fmt.Errorf("хуе-мое не могу отправить: %w", err) и передавать на самый верх в main. Так если ошибка возникнет, получишь полный и удобный стектрейс по которому найдешь проблему за несколько секунд.
А ещё у тебя сгорит жопа от того, что 3 это не 2+1.
это особенность языка. через какое-то время начинают появляться подозрения, что функциии, не возвращающие ошибки и не принимающие контекст на вход могут делать сетевые вызовы ниже по стеку даже если это не так.
алсо
>зачем-то копируется поинтер на дефолтный хттп клиент, который юзается 1 (один) раз
>конструктор реквеста без параметров может зафейлиться
>err = errors.New(fmt.Sprintf())
>анмаршал и рид жсона в два шага вместо json.NewDecoder().Decode() без каких-либо действий, которые бы оправдывали это
годно, спасибо
>конструктор реквеста без параметров может зафейлиться
Имеется в виду makeAuthRequest? Реквест по сути статичный, параметры подставляются из env
Какая паника? В го так не приятно, мы обычно правильно хендлим ошибку, а не просто выключаем комп от сети
>правильно хендлим ошибку
То есть аккуратно, руками, чтобы ничего не напутать, передаём nil наверх.
Не как они работают, а области их применения?
Можно ли, допустим ,получив структуру Some у которой есть n вложенностей, которые необходимо заполнить, заполнить вызвав n горутин, каждая их которых изменит изначальную структуру Struct?
Многопоточность - это про ввод/вывод во всех языках программирования. Её не надо применять, работая в оперативной памяти.
>Можно ли, допустим, получив структуру Some у которой есть n вложенностей
Можно, только в твоем конкретном примере частный случай, параллельность.
https://go.dev/play/p/KTM1booW8Y9
Анон выше правильно заметил, что многопоточность скорее про асинхронность
>>732538
Смотря какая задача стоит, если каждая операция съедает много процессорного времени, а отклик нужен быстрый, т оимеет смысл распараллелить вычисления. Но тут еще сложности вылезают с подсчетом оптимального числа горутин и как их шедулер раскидать между ядрами вообще не ебу пока что.
Go самостоятельно раскидывает по ядрам процессора тяжелые матаны и самостоятельно дробит байты в раме под эти расчёты. Если ты хочешь поиграть в русскую рулетку со своим коленом, то есть инструменты ручного управления этими вещами.
ну вполне обычный паттерн. есть какая-нибудь структура, аггрегирующая разные сущности, в горутинах запускаются сетевые походы в сервисы, которые отдают эти сущности, их ответы складываются в одну структуру (ну чаще там еще какие-нибудь действия над ответами идут и структура формируется уже после обработки) и т.п.
С чего начать:
- В обязательном порядке проходим Go Tour: https://go.dev/tour/welcome/1
- Читаем документацию (рекомендуется начать со спеки и Effective Go): https://go.dev/doc/
- Ознакамливаемся с общим roadmap по изучению языка и сопутствующих инструментов: https://github.com/Alikhll/golang-developer-roadmap (постоянно обновляется сообществом)
Литература:
- Донован, Керниган "Язык программирования Go"
- Также хорошие книги для начала: https://www.golang-book.com/ и https://www.practical-go-lessons.com/ (веб-версия - бесплатная и хорошо подходит для новичков в программировании)
- Книги из списка https://github.com/dariubs/GoBooks
Полезные ресурсы:
- Сборник паттернов и инфы по микросервисам: https://microservices.io/
- Смотрим видео https://www.youtube.com/channel/UC_BzFbxG2za3bp5NRRRXJSw
- Обновляемый список с пакетами: https://github.com/avelino/awesome-go
Небольшая конфа треда: https://t.me/golang2ch более чем живая!
Предыдущий тред тонет здесь: >>665435 (OP)
Не проверил на nil, признайся честно?
Это копия, сохраненная 1 июля 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.