С чего начать:
- В обязательном порядке проходим "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
"Небольшая конфа треда" - мертва? Последний раз добавляли ссылку год назад.
Прошлый тред: >>3262042 (OP)
> Пацаны, поясните за обработку ошибок. Там выше кто-то уже спрашивал, но мне кажется тема ерроров осталась нераскрыта.
>
>Допустим у меня http обработчик сидит в самом верху, дергает метод из пакета (будем считать для простоты, что у меня 1 application layer = 1 пакет) А, тот дергает метод из пакета В, тот дергает метод из пакета С. Каждый из пакетов имеет свою структуру для ошибок: ErrorA, ErrorB, ErrorC, которые я могу набивать всяким полезным контекстом, чтоб потом его высрать в тело респонса жсоном. Собственно два вопроса:
>
>1. Как лучше сделать: чтобы пакет B при получении ErrorC оборачивал ее дополнительно своей ErrorB? Или ErrorB -- это чисто ошибки, относящиеся к самому пакету В? В первом случае вроде получается чето более-менее похожее на нормальный стектрейс, если у всех ошибок будет допустим какое-то поле Cause error, но тогда наверху у меня всегда будут только ошибки ErrorA, и если мне нужно разное поделать в зависимости от того, что же там за real cause была -- будет неудобно. Во втором случае стектрейса никакого нахуй нет, как такие ошибки например логгировать с пользой -- непонятно, но код проверки ошибок в обработчике становится хотя бы поприятнее.
>
>2. В обоих этих случаях выходит так, что обработчик должен быть в курсе обо всех ошибках, которые могут произойти во всем ебаном приложении, то есть он должен знать и про ErrorA, и про ErrorB, и про ErrorC. Чето я слабо себе представляю, как такой подход будет скейлиться, если аппка становится хоть сколько-то большой (ну там на пару десятков эндпоинтов хотя бы). Какие есть альтернативные варианты? Я сам чето ничего не надумал более умного.
Вот тут поддвачну. Есть примеры проектов на гитхабе, где обработка ошибок в классическом круд приложении сделана по уму? Плюс еще хотелось бы видеть типизированные ошибки. Например отдать ошибку с человекочитаемым сообщением. Сейчас у меня на проекте заводится отдельный класс исключения, куда я явно устанавливаю сообщение об ошибке, которое само при помощи магии фреймворка прокидывается из сервиса в контроллер, сериализуется и уходит на фронт в виде джейсончика.
Если же я буду все ошибки сервиса отдавать в виде одной структуры type ServiceError struct, то рано или поздно может случиться так, что в контроллере понадобится разная обработка сервисных ошибок и я пососу хуй. Если же буду заводить отдельную структуру на каждую ошибку бизнес-логики, то контроллер вырастет в размерах просто до огромных размеров и его станет невозможно поддерживать.
В общем нужны примеры как с этой хуйней бороться. Ну и то же самое с ошибками от репозитория. Тоже несколько структур заводить? И каждую из них потом обратабывать сначала в сервисе, а потом в контроллере? Тяжело....
> Пацаны, поясните за обработку ошибок. Там выше кто-то уже спрашивал, но мне кажется тема ерроров осталась нераскрыта.
>
>Допустим у меня http обработчик сидит в самом верху, дергает метод из пакета (будем считать для простоты, что у меня 1 application layer = 1 пакет) А, тот дергает метод из пакета В, тот дергает метод из пакета С. Каждый из пакетов имеет свою структуру для ошибок: ErrorA, ErrorB, ErrorC, которые я могу набивать всяким полезным контекстом, чтоб потом его высрать в тело респонса жсоном. Собственно два вопроса:
>
>1. Как лучше сделать: чтобы пакет B при получении ErrorC оборачивал ее дополнительно своей ErrorB? Или ErrorB -- это чисто ошибки, относящиеся к самому пакету В? В первом случае вроде получается чето более-менее похожее на нормальный стектрейс, если у всех ошибок будет допустим какое-то поле Cause error, но тогда наверху у меня всегда будут только ошибки ErrorA, и если мне нужно разное поделать в зависимости от того, что же там за real cause была -- будет неудобно. Во втором случае стектрейса никакого нахуй нет, как такие ошибки например логгировать с пользой -- непонятно, но код проверки ошибок в обработчике становится хотя бы поприятнее.
>
>2. В обоих этих случаях выходит так, что обработчик должен быть в курсе обо всех ошибках, которые могут произойти во всем ебаном приложении, то есть он должен знать и про ErrorA, и про ErrorB, и про ErrorC. Чето я слабо себе представляю, как такой подход будет скейлиться, если аппка становится хоть сколько-то большой (ну там на пару десятков эндпоинтов хотя бы). Какие есть альтернативные варианты? Я сам чето ничего не надумал более умного.
Вот тут поддвачну. Есть примеры проектов на гитхабе, где обработка ошибок в классическом круд приложении сделана по уму? Плюс еще хотелось бы видеть типизированные ошибки. Например отдать ошибку с человекочитаемым сообщением. Сейчас у меня на проекте заводится отдельный класс исключения, куда я явно устанавливаю сообщение об ошибке, которое само при помощи магии фреймворка прокидывается из сервиса в контроллер, сериализуется и уходит на фронт в виде джейсончика.
Если же я буду все ошибки сервиса отдавать в виде одной структуры type ServiceError struct, то рано или поздно может случиться так, что в контроллере понадобится разная обработка сервисных ошибок и я пососу хуй. Если же буду заводить отдельную структуру на каждую ошибку бизнес-логики, то контроллер вырастет в размерах просто до огромных размеров и его станет невозможно поддерживать.
В общем нужны примеры как с этой хуйней бороться. Ну и то же самое с ошибками от репозитория. Тоже несколько структур заводить? И каждую из них потом обратабывать сначала в сервисе, а потом в контроллере? Тяжело....
Мимо прохожу, интересуюсь, а задача на каком то из верхних уровней тут ошибку разбирать или что?
Я работал в проекте где с нижнего уровня ошибка заворачивалась в fmt.Errorf("some_func error: %v", err)
Получался такой вот импровизированный стектрейс, а на верхнем уровне перед отдачей ошибки в response это приводилось к единой структуре ошибки
type ResponseError struct {
ExternalCode int32
InternalCode int32
ExternalDescription string
InternalDescription string
IsTemporary bool
}
По InternalCode быстро находилось верхняя точка косяка, а далее по описанию ошибки разбираем в чем проблема
По ощущениям для средних проектов хватает, дальше это можно будет улучшить через Wrap и тп
Просто мимо треда шел, но увидел третью пикчу...
А за что что вы того розового узкоглазого хомяка аж огнеметом палите? Это маскот какого-то очень очень кривоуебищного пакета в го вашем?
>на верхнем уровне перед отдачей ошибки в response это приводилось к единой структуре ошибки
Разверни чуть подробнее, каким образом вы выхлоп Error() приводили к этой структуре? Или респонс код и прочее сказу зашивали на этапе выброса первичной ошибки?

>Это маскот какого-то очень очень кривоуебищного пакета в го вашем?
То есть каждого пакета как и языка в принципе?
Просто записывали в InternalDescription
Так как нам от ошибки ничего большего, чем стектрейс через строки и internal сode для быстрого нахождения косяка на верхних уровнях, не было нужно, то мы просто написали пачку конструкторов для разных http статусов (которые ExternalCode)
Ну я это представляю так, что как минимум у меня могут быть ошибки клиента, и могут быть мои серверные ошибки. Ошибки клиента я хочу НЕ логгировать, резолвить в подходящий 4xx код и возвращать жсоном с мессаджем и какими-то полями; ошибки сервера я наоборот хочу логгировать, резолвить в 500, клиенту отдавать либо тоже что-то кастомное, либо дефолтное "что-то пошло не так", а в лог писать стектрейс и опять же какой-то контекст ошибки. При этом контекст ошибки может собираться и из контекстов обернутых ошибок

Пошел нахуй, пидар

Я на своем проекте пришел к такому костылю. Не знаю насколько правильно, но структура вот такая. Дальше в логгере я сохраняю Internal, а юзеру отдаю Message (который чаще всего либо стринга, либо массив с набором ошибок)
А для чего он дизайнился, для перфокарт? Эксепшены в 2024 году - это общепризнанная фича, очень удобно бросить и поймать где-то наверху, а не засирать код err != nill после каждого вызова.
Для замены инфраструктурных сервисов на гуглостайловом плюсоговне, а не для джава тырпрайза с джейсонами и исключенияи?
@
Дедам дали волю наговнить свою мечту из 70х годов, написать свой си
@
Деды продали идею гуглу, что сделают простой си, что даже самый тупой сможет на нем писать как плюсовик +30 лет стажа.
@
Как это бывает, фантазий на новый язык было только на какие-то базовые вещи, остальное пришлось прикрутить наспех и необдуманно ибо деды умеют мечтать, а проектировать языки не умеют.
@
Идею что даже самый тупой будет писать на уровне бородатого плюсовика попытались продать кабану
@
Но что-то пошло не так
@
Теперь рынке требуются только бородатые гошники, из-за дефицита ценник как у кобола.
@
Джуны стоят внизу и облизываются.
@
Гошники на перегонки косплеят эксепшены, костылят кодогенирацию, радуются бойлерплейтам.
2. Что вообще на гошке пишут?
3. Как ситуация с джунами?
съеби, вкат закрыт
Да.
Всё пишут, любой веб и всё, что связано с облаками.
Джуны не нужны. Вообще нахуй не нужны, вкат только на мидла.

1. Когда начинал - выбирал язык для своего проекта, на бабло вообще не смотрел.
2. Бэкенды к чему угодно.
3. Если они программисты из-за денег - наверно, им сложно.
>для своего проекта
Ты сервис какой-то пилишь? Уже работал до этого прогером или имел опыт прогерства? Устроился на работу?
1. Пока работа в бигтехе. Накапает опыт в резюме и съебу нахуй
2. Микросервисы в основном
3. Джунов на го не существует, кроме выпускников ВУЗов в бигехах. Все гошники - перекатыши из пыхи и джавы

А че вы трай кетч вырезали к фигам, да и throw тоже? Вас не задолбало писать if err != nil { log }?
Почему вместо while loop используется for ? Честно, очень путает
Пока что это все вопросы, но они не дают покоя. Вчера плохо спал т.к. думал над этими "гениальными" решениями
Потому что try/catch это goto, скрытый, с неявным назначением, запутыванием стектрейса, обработкой ошибок в другой части кода.
Всё от минимализма, и всё понятно, если узнать, что Го делали во многом те же люди, что работали над С. Ну и в целом многие вопросы по гошке отваливаются сами собой, если есть знание чистого си.
> Почему вместо while loop используется for ? Честно, очень путает
А че с этим не так, просто вместо while пишешь for и все
Как замена https://google.github.io/styleguide/cppguide.html для всяких сетевых штук, которых надо писать посто дохуя, го заебись и решает задачи. А то, что там веб-макаки начали го засовывать во все дыры - это уже не проблема дезигна.
Т.е. вот это пишут на говне https://github.com/XTLS/Xray-core и им заебись
Ну то есть го нужен для 1.5 сетевых утилит в гигакорпорациях уровня Гугла и Яндекса?
Там уже подрачивают на раст (мне лень искать статью), походу го ждет судьба дарта.
Пока я смотрю на го и ощущение что все кроме фреймворка (echo, gin) пишется с нуля используя stdlib. Да и фреймворки судя по реддиту тоже не любят.
>все кроме фреймворка (echo, gin) пишется с нуля используя stdlib
Стандартной библиотеки за глаза.
Лучший язык как никак
Из того что сразу в голову приходит:
В го нет нормального стектрейса в стандартной либе . Мне нравиться emperror.
Нечто более специфичное но мне нравится- grpc-gateway вместо веб фреймворка. Генерит сразу реверс прокси, сваггер, ну и протобуфные штуки. Кайф короче
- Утиные интерфейсы. По моему какая-то лютая нечитаемая хрень. Вместо того, чтобы просто глянуть сигнатуру класса и узнать, что именно он реализует (и, соответственно, куда его можно скормить), нужно каким-то блять магическим образом угадать, основываясь на прикрепленных к структуре функциях, какой же сука интерфейс она реализует (сам интерфейс ясен хуй валяется вообще в другом пакете, и это считается очень идиоматично и круто). Хуй поймешь в чем профит такого дизайн-решения.
- Отсутствие нормальных неймспейсов. В традиционных ООП языках все можно красиво рассовать по пакетикам и классикам, каждый из которых автоматически родит новый неймспейс для всего, что внутри. В го по факту пакеты это единственный способ родить неймспейс, ничего мельче нету. Сами пакеты внутри представляют собой какие-то солянки всякой всячины, наваленной в кучу по принципу "ну вроде из той же оперы". Ублюдочное решение с capitalized названиями функций/переменных для определения их визибилити.
- Работа со строками и массивами с каких-то хуев идет не через прицепленные к ним методы, а через strings и slices. Я хуй знает, может я чего-то не понял, но мне чето кажется, что говно в духе strlen, strncpy и прочее просто нахуй не должно существовать в новом языке, когда очевидно, что s.length и s.substring() выигрывают в читабельности и удобстве на порядки.
- Абсолютно надуманная нахуй не нужная еботня с pointer vs value.
- Работа с ошибками. По факту предлагается на выбор два сорта говна, которые можно еще и смешивать между собой - sentinel values и создание кучи абсолютно одинаковых структур под разные типы ошибок. Первый подход еще можно использовать без рвотных позывов благодаря errors.Is(), но при необходимости в таком случае достать дополнительный контекст ошибки начинается трахомудия. Второй подход более гибкий, если это слово сюда вообще применимо, но проверка типа ошибки через errors.As() это ебаный кал собаки, раздувающий сервисы/хэндлеры до космических размеров на ровном месте.
- Крайняя невыразительность языка. Даже тернарника нет, ебаный стыд. Вечная еботня с шэдоуингом ерроров, возвращаемых вторым значением в кортеже. Идиотская надуманная разница между = и :=.
Пока что понравилось по большому счету только принудительное форматирование кода из коробки к единому стилю, и каноничные табы вместо пробелов для отступов.
- Утиные интерфейсы. По моему какая-то лютая нечитаемая хрень. Вместо того, чтобы просто глянуть сигнатуру класса и узнать, что именно он реализует (и, соответственно, куда его можно скормить), нужно каким-то блять магическим образом угадать, основываясь на прикрепленных к структуре функциях, какой же сука интерфейс она реализует (сам интерфейс ясен хуй валяется вообще в другом пакете, и это считается очень идиоматично и круто). Хуй поймешь в чем профит такого дизайн-решения.
- Отсутствие нормальных неймспейсов. В традиционных ООП языках все можно красиво рассовать по пакетикам и классикам, каждый из которых автоматически родит новый неймспейс для всего, что внутри. В го по факту пакеты это единственный способ родить неймспейс, ничего мельче нету. Сами пакеты внутри представляют собой какие-то солянки всякой всячины, наваленной в кучу по принципу "ну вроде из той же оперы". Ублюдочное решение с capitalized названиями функций/переменных для определения их визибилити.
- Работа со строками и массивами с каких-то хуев идет не через прицепленные к ним методы, а через strings и slices. Я хуй знает, может я чего-то не понял, но мне чето кажется, что говно в духе strlen, strncpy и прочее просто нахуй не должно существовать в новом языке, когда очевидно, что s.length и s.substring() выигрывают в читабельности и удобстве на порядки.
- Абсолютно надуманная нахуй не нужная еботня с pointer vs value.
- Работа с ошибками. По факту предлагается на выбор два сорта говна, которые можно еще и смешивать между собой - sentinel values и создание кучи абсолютно одинаковых структур под разные типы ошибок. Первый подход еще можно использовать без рвотных позывов благодаря errors.Is(), но при необходимости в таком случае достать дополнительный контекст ошибки начинается трахомудия. Второй подход более гибкий, если это слово сюда вообще применимо, но проверка типа ошибки через errors.As() это ебаный кал собаки, раздувающий сервисы/хэндлеры до космических размеров на ровном месте.
- Крайняя невыразительность языка. Даже тернарника нет, ебаный стыд. Вечная еботня с шэдоуингом ерроров, возвращаемых вторым значением в кортеже. Идиотская надуманная разница между = и :=.
Пока что понравилось по большому счету только принудительное форматирование кода из коробки к единому стилю, и каноничные табы вместо пробелов для отступов.
Чувак, Го - низкоуровневый язык.
С великолепной поддержкой конкурентного программирования.
И интерфейсы - тоже одна из главных киллер-фич, ты просто не понял нихуя.
Но, да, язык очень сильно не для всех. И точно не для вката с улицы.
И с неймспейсами (с их отсутствием) они лоханулись капитально.
Вообще - язык очень сырой, выглядит как грязный хак, который делали для внутреннего употребления, а потом отпустили на волю. Типа Котлина, не к ночи будь он помянут.
>Чувак
Уже достаточно.
>Го - низкоуровневый язык
Ну началось в колхозе утро. Что в нем низкоуровневого, расскажи? Тот факт, что надо явно таскать за собой указатели и/или каждый раз думать, нужно ли мне передать в функцию конкретно эту структуру или ее копию? В языке со сборщиком мусора эта ебола вообще нахуй не нужна. Ах да, сборщик мусора.Плюс решать, где ты будешь размещать структуру - на стеке или в куче - здесь тоже нельзя. В чем тут низкоуровневость?
>И интерфейсы - тоже одна из главных киллер-фич, ты просто не понял нихуя.
Возможно. Зато я вижу, что я никак не могу в компайл-тайм проверить, что моя структура реализует интерфейс. Вернее могу, но через жопу, специальным var _ MyInterface = (*MyStruct)(nil) заклинанием. Просто заебись.
>И точно не для вката с улицы
Мне и после 10 лет жабы, питона и жабаскрипта все вышеобозначенные вещи кажутся полной ебанутой хуйней.
>Мне и после 10 лет жабы, питона и жабаскрипта все вышеобозначенные вещи кажутся полной ебанутой хуйней.
Это другой язык, понимаешь?
Не лучше, не хуже, а другой.
И его надо учить, а не думать, что тебе и так всё должно быть понятно.
Это сложный язык, и очень сильно не для всех.
И тебе он, скорее всего, не нужен. Как и мне.
Вроде как это нужно для graceful shutdown, чтобы при sigterm отменить все задачи. Но бекграунд пустышка, она не умеет отменять. Почему бы просто тогда не создавать отдельные контексты на уровне хендлера сервера?
И это правда, что все функции что работают с сетью, бд и файлами всегда должны иметь контекст первым аргументом? Как вы делаете?
> Утиные интерфейсы
> глянуть сигнатуру класса и узнать, что именно он реализует
Потому что класс может дохуя всего имплементировать и их явное указание сильно засрало бы код, а для понимания какие структуры какие интерфейсы реализуют есть IDE
> Работа со строками и массивами с каких-то хуев идет не через прицепленные к ним методы, а через strings и slices.
Вот на это кстати как будто насрать в проде, там не нужна вся эта изощренная ебля со строками/массивами
> Даже тернарника нет
А вот тернарников да, иногда не хватает
> Отсутствие нормальных неймспейсов
Бля, да, а вот это мем, я когда понял что чтобы написать +- норм либу, нужно все срать на верхнем уровне проекта, я немного охуел)
> Вечная еботня с шэдоуингом ерроров
А как это мешает? Мне это только пару раз помешало, пришлось первый аргумент до вызова функции в var объявить
Лично меня нередко калит херня с маппингом структур, а-дя DTO и external версия одной и той же структуры (которые отличаются наличием полей id и deleted в dto версии), но я хз как это в других ЯП делается
На истину не претендую, я мимо студентик-стажер
Контекст крутая идея как по мне. Да, он везде должен пробрасываться. Помимо того что он может быть закэнселен, в него также можно складывать всякое. Это бывает удобно, у нас на проекте например взаимодействие некоторых gprc сервисов через это реализовано. Типа в некоторых интерсепторах грац в контекст складывается нужное валью (например какая нибудь метаинформация с фронта) и передается дальше
> Но бекграунд пустышка, она не умеет отменять
Потому что для глобального graceful shutdown всех модулей/сервисов нужно создавать context.WithCancel(context.Background())

И мне при этом не надо трахаться с err != nil
>подрачивают на раст
Издалека, как и мы все, ибо он страшный как ассэмблер блядь.
Мне почему-то ГО всегда казался "более быстрым питоном" чтоб можно было быстро нахуярить программу, в чём я не прав? (не считая обилия библиотек)
>emperror
> // Recover from panics and handle them as errors
>defer emperror.HandleRecover(handler)
Из каждого утюга же пиздят что не надо рековерить го ерроры и надо с каждой ошибкой вручную ебаться
if err != nil
, врут?
Потому что рантайм у гошки массивный? Ты там GMP-машину в хелло ворлд тащишь, очевидно же. Потому же и либы на го не пишут для использования в не гошной кодовой базе.
Нахуярить быстрее чем на питоне? Не. Попробуй посмотреть на него как на С, на который высыпали самосвал сахара.
Без понятия, таким не пользуюсь и паниками тоже (только в редких случаях). Я говорил скорее про emperror.Wrap и emperror.WithStack

Про интерфейсы и неймспейсы - ну, а с "классами" получается не лучше, по-моему.
>Ублюдочное решение с capitalized названиями функций/переменных для определения их визибилити.
Да вроде нормальное.
>Абсолютно надуманная нахуй не нужная еботня с pointer vs value.
Типа, "программист вообще не должен задумываться над подобным выбором"?)) Для таких существуют ЯваСкрипты и прочие Явы.
>Даже тернарника нет, ебаный стыд.
Да и ладно, он же затрудняет чтение.
>>12028
>Вообще - язык очень сырой, выглядит как грязный хак
Мне тоже начало так казаться со временем. Но, блин, а проекты на других языках, когда разрастаются, что ли выглядят лучше? Я очень сомневаюсь - это судьба всех языков...
>>12742
Ну, не "сахара", а важных достаточно вещей.
http.ListenAndServe(":3000", nil) // вот тут запускает локальный сервер на порте 3000?
http.HandleFunc("/", myHandler) // - тут подрубается какой-то handlefunc, который типо обрабатывает подключение клиента по url-у "localhost:3000/", и как только обнаруживает подключение - выполнится скопированная функция myHandler
func myHandler(w http.ResponseWriter, r http.Request) {
log.Println("hi from Handler!")
w.WriteHeader(http.StatusOK)
} // но что такое ResponseWritter и http.Request? Почему *http.Request передаётся по ссылке?
Извиняюсь за тупые вопросы, но нагуглить ничего не могу.
Некоторые ещё подрубают какой-то ServeMux, где вообще становится не понятно. Пишут, что ServeMux - маршрутизатор, но что он маршрутизирует, чем он управляет, если даже без него код работает также, как и с ним.
// HandleFunc регистрирует handler в глобальный DefaultServeMux (net/http/server.go)
// http.ListenAndServe без второго аргумента слушает твой адрес и передает роутинг DefaultServeMux
// http.Request указатель на объект запроса; ResponseWritter интерфейс (поэтому без указателя, он и так им является) на объект для создания ответа
// Можно создать свой ServeMux и регистрировать в него handler'ы, а после передать в ListenAndServe
Не хочу быть снобом, но ты меня вынуждаешь друг. Это все stdlib, у которой довольно неплохое описание в исходниках и документации. Погляди.
Начнём с самого начала.
>HandleFunc регистрирует handler в глобальный DefaultServeMux (net/http/server.go)
Что значит "HandleFunc регистрирует handler"? Какой handler, что это. Если регистрирует, то откуда-то его берёт, но откуда. И что это.
Что значит "глобальный DefaultServeMux"? Что вообще такое ServeMux, какую функцию выполняет?
>http.ListenAndServe без второго аргумента слушает твой адрес и передает роутинг DefaultServeMux
Без второго аргумента оно не работает это раз; два - что значит роутинг; три - что такое DefaultServeMux. Зачем туда что-то передавать.
>http.Request указатель на объект запроса; ResponseWritter интерфейс (поэтому без указателя, он и так им является) на объект для создания ответа
"http.Request указатель на объект запроса" - что такое объект запроса, зачем он нужен.
Что значит "на объект для создания ответа". В смысле объект.
>Можно создать свой ServeMux и регистрировать в него handler'ы, а после передать в ListenAndServe
Спасибо за совет, но ничего не понятно.
Мне гораздо проще понимается всё на практике, можешь посоветовать где всё это можно было-б прочитать и протестить.

Буквально все это можно спросить и чатгпт анон. Так ты не будешь тратить время многоуважаемых голанг наносников итт, а еще и объяснят лучше.
>Го - низкоуровневый язык
В каком месте?
>>12028
>язык очень сильно не для всех
А для чего и для кого он? Вон выше скидывали пример XTLS-Xray как сетевой утилиты, написанной на го. Но таких вещей делают 1.5 команды в мире.
В России го зачем-то используют для крудов, которые раньше писались на джаве, шарпе и питоне. И мне кажется для крудов это сильно плохой выбор, начиная самим всратым языком, заканчивая весьма убогим тулингом для написания классических бекендов с походами в базу данных. Да, можно все писать на голом net/http, и я так пробовал, но получается хуйня, объемы бойлерплейта раздуваются просто до космических масштабов.
>Зато я вижу, что я никак не могу в компайл-тайм проверить, что моя структура реализует интерфейс. Вернее могу, но через жопу, специальным var _ MyInterface = (*MyStruct)(nil) заклинанием
Двачую, тоже раздражает эта хуйня.
А что именно раздувается? Пример покажи пожалуйста
Я написал вот небольшой сервис, но напряга супер не заметил.
Конечно на шарпе половина бы само сгенерилось, но хз как-то
>А что именно раздувается
Обработка ошибок.
Работа с ошибками. По факту предлагается на выбор два сорта говна, которые можно еще и смешивать между собой - sentinel values и создание кучи абсолютно одинаковых структур под разные типы ошибок. Первый подход еще можно использовать без рвотных позывов благодаря errors.Is(), но при необходимости в таком случае достать дополнительный контекст ошибки начинается трахомудия. Второй подход более гибкий, если это слово сюда вообще применимо, но проверка типа ошибки через errors.As() это ебаный кал собаки, раздувающий сервисы/хэндлеры до космических размеров на ровном месте.
>- Утиные интерфейсы.
Это отдельный пиздец, особенно если структура гуляет через методы где тип пустой интерфейс отдельная тема, тогда узнаешь о том что не имплементирует в рантайме. Какой вообще долбоеб додумался до такой хуеты, чтобы он каждый раз узнавал что его туалет не имплементриовал туалетную бумагу каждый раз когда он посрет
>- Отсутствие нормальных неймспейсов.
Тоже пиздец, я бы сюда еще цикличные импорты добавил
>- Работа со строками и массивами с каких-то хуев идет не через прицепленные к ним методы, а через strings и slices. Я хуй знает, может я чего-то не понял, но мне чето кажется, что говно в духе strlen, strncpy и прочее просто нахуй не должно существовать в новом языке, когда очевидно, что s.length и s.substring() выигрывают в читабельности и удобстве на порядки.
Ты еще более интимно со слайсами не познакомился, при присвоении другой переменной там не всегда понятно ты со старым работаешь или создался новый. Это такой кривой дизайн
>- Абсолютно надуманная нахуй не нужная еботня с pointer vs value.
Это кстати наоборот полезная вещь когда знаешь что передал конкретно ссылку и конкретно значение, это позволяет избежать дополнительного выделения памяти, особенно когда гоняешь одну и ту же структуру по калопроводам бизнес логики
>- Работа с ошибками.
Это говно ебучее, с той же философией сделали в расте и оно удобнее когда вместо бойлерплейта наверх пробрасываешь при помощи ? но там проблема что разные типы друг в друга не впихуются и приходится брать anyhow или колхозить свой тип ошибок и писать From для каждого типа, которых собираешься впихнуть, тоже говнясто, но уже лучше чем в go.
Этот подход с ошибками с одной стороны хорошо ты начинаешь обрабатывать ошибки которые мог бы не учесть при исключениях и уже добавляешь нужное поведение. С другой стороны для обычного бекенда чтобы гонять json туда-сюда это крайне избыточно, такое хорошо наверное где требуется высокая паранойя и ответственность чтобы не одна ошибка не проскочила. В остальных случаях проще наверху ловить в try/catch ролбекать транзакцию и посылать нахуй клиента. В той нише куда залетел го я думал лучше было бы второе.
>- Крайняя невыразительность языка. Даже тернарника нет, ебаный стыд. Вечная еботня с шэдоуингом ерроров, возвращаемых вторым значением в кортеже. Идиотская надуманная разница между = и :=
Ну тут типа философия го, типа ты можешь что-то сделать только одним способом, плюс делали акцент на том что язык простой и понятный для всех, поэтому в нем много чего нет. Да и морж оператор хуйня согласен
>- Утиные интерфейсы.
Это отдельный пиздец, особенно если структура гуляет через методы где тип пустой интерфейс отдельная тема, тогда узнаешь о том что не имплементирует в рантайме. Какой вообще долбоеб додумался до такой хуеты, чтобы он каждый раз узнавал что его туалет не имплементриовал туалетную бумагу каждый раз когда он посрет
>- Отсутствие нормальных неймспейсов.
Тоже пиздец, я бы сюда еще цикличные импорты добавил
>- Работа со строками и массивами с каких-то хуев идет не через прицепленные к ним методы, а через strings и slices. Я хуй знает, может я чего-то не понял, но мне чето кажется, что говно в духе strlen, strncpy и прочее просто нахуй не должно существовать в новом языке, когда очевидно, что s.length и s.substring() выигрывают в читабельности и удобстве на порядки.
Ты еще более интимно со слайсами не познакомился, при присвоении другой переменной там не всегда понятно ты со старым работаешь или создался новый. Это такой кривой дизайн
>- Абсолютно надуманная нахуй не нужная еботня с pointer vs value.
Это кстати наоборот полезная вещь когда знаешь что передал конкретно ссылку и конкретно значение, это позволяет избежать дополнительного выделения памяти, особенно когда гоняешь одну и ту же структуру по калопроводам бизнес логики
>- Работа с ошибками.
Это говно ебучее, с той же философией сделали в расте и оно удобнее когда вместо бойлерплейта наверх пробрасываешь при помощи ? но там проблема что разные типы друг в друга не впихуются и приходится брать anyhow или колхозить свой тип ошибок и писать From для каждого типа, которых собираешься впихнуть, тоже говнясто, но уже лучше чем в go.
Этот подход с ошибками с одной стороны хорошо ты начинаешь обрабатывать ошибки которые мог бы не учесть при исключениях и уже добавляешь нужное поведение. С другой стороны для обычного бекенда чтобы гонять json туда-сюда это крайне избыточно, такое хорошо наверное где требуется высокая паранойя и ответственность чтобы не одна ошибка не проскочила. В остальных случаях проще наверху ловить в try/catch ролбекать транзакцию и посылать нахуй клиента. В той нише куда залетел го я думал лучше было бы второе.
>- Крайняя невыразительность языка. Даже тернарника нет, ебаный стыд. Вечная еботня с шэдоуингом ерроров, возвращаемых вторым значением в кортеже. Идиотская надуманная разница между = и :=
Ну тут типа философия го, типа ты можешь что-то сделать только одним способом, плюс делали акцент на том что язык простой и понятный для всех, поэтому в нем много чего нет. Да и морж оператор хуйня согласен
>Го - низкоуровневый язык.
Ну как сказать, чуть пониже жабы да, но в целом та же хуйня
>С великолепной поддержкой конкурентного программирования.
Даже в js с промисами удобнее работать чем с горутинами, тут столько косяков в дизайне
>И интерфейсы - тоже одна из главных киллер-фич
Действительно иногда в процессе выполнения бывает киллер-фича
>Но, да, язык очень сильно не для всех.
Проблема в том что его везде стали использовать
>Типа Котлина, не к ночи будь он помянут.
Они там упоролись по-другому. Основное это вендорлок, без их ide работа с языком затруднена и jvm это просто финиш, теперь туда пришли спринг и копроративное болото. Могли бы вместо всякой компиляции в js запилить kotlin native чтобы работать без жвм и сделать менее прибитым к ide и в целом к своей компании, тогда и взлетел бы повыше.
>В России го зачем-то используют для крудов, которые раньше писались на джаве, шарпе и питоне.
Скорее всего попробовали дать жабистам пописать на нем, а синтаксис не дает размахнутся с AbstractSingletonProxyFactoryBean, вот и получилось написать за несколько дней то что раньше писалось несколько месяцев на жабе, кабанчикам понравилось и понеслась
> Это отдельный пиздец, особенно если структура гуляет через методы где тип пустой интерфейс отдельная тема, тогда узнаешь о том что не имплементирует в рантайме. Какой вообще долбоеб додумался до такой хуеты, чтобы он каждый раз узнавал что его туалет не имплементриовал туалетную бумагу каждый раз когда он посрет
Можно какой то более конкретный пример когда это проблема? Я искренне не понимаю ситуации где функция должна принимать пустой интерфейс а не конкретный. Звучит как хуевый дизайн самого метода/сервиса
>Звучит как хуевый дизайн самого метода/сервиса
Звучит как примерно 90% кодовой базы. Я часто вижу, что интерфейсов либо нет, и всё захардкожено, либо везде var 🤡 interface{}
Проблема в том что ты не всегда живешь в идеальном мире и код не всегда написан тобой и иногда приходится видеть такое. Ну и плюс сторонние либы чуть менее чем полностью состоят из пустых интерейсов.
То что с нуля пишется разумеется уже имеет лучшую архитектуру и адекватный код
А зачем тогда нужен язык со статической типизацией? Проще питон взять.
interface{} это все равно что указатель на void в Си использовать. Или Object из джавы.
>А зачем тогда нужен язык со статической типизацией?
Говорят тогда будет работать на 0.1234 ns быстрее всё если типы прямо указывать, не зря ебёмся же

Фреймы для быдла.
>Они там упоролись по-другому. Основное это вендорлок, без их ide работа с языком затруднена и jvm это просто финиш, теперь туда пришли спринг и копроративное болото. Могли бы вместо всякой компиляции в js запилить kotlin native чтобы работать без жвм и сделать менее прибитым к ide и в целом к своей компании, тогда и взлетел бы повыше.
Котлин теперь основной язык разработки под андроид. Это огромный кусок рынка. И начинался он именно как better Java, чтобы реализовать синтаксисический сахар, но так чтобы всё работало на Dalvik. В бекенд он пришёл сильно позже и это уже была попытка ЖБ как-то ещё пристроить язык и продавать свои IDE. И в целом, там где пишут а не переписывают с Jaca бэк на Котлине Спринг не используют.
Но создатель языка сказал что го для тупых?
>прибитым к ide и в целом к своей компании,
Жаба прибита все к той же IDE, но никто об этом не кричит.
выбрал шарпы для своих проектов, только потому что нормальная поддержка в трех крупных редакторах
Звездеж, жабист/шарпист со спрингом/asp.net за минуту разворачивает то, что на го еще даже не написано еще.
Го пытались продать как язык для тупых, мол кабан получить тру-кодеров по цене суслика. Но деды родом из 70х не писавшие реального кода 50 лет не знали, что главная сложность в современной разработке это не синтаксис.
На го не пишут реальный веб, там микро-писька кидающиеся json'нами, что-то больше на нем писать на можно, но больно, поэтому до сих пор нет норм веб комбайна. естественно будут кричать ненужно, все чего нет всегда кричат ненужно, как и дебаггер не нужен был, как и дженерики, как и обработка ошибок итд
Котлин лишь обосрался с тем, что на jvm больше (практически) не начинают бэкенд проекты.
>на jvm больше (практически) не начинают бэкенд проекты
Этим мантрам уже лет 10.
>2 978 вакансий «Java»
>1 157 вакансий «C#»
>1 696 вакансий «Go»
>1 696 вакансий «Go»
На некоторых сайтах у го багованный поиск из-за простого базворда. Да, в топе более релевантное но дальше идет мусор. В моей мухосране вообще выдает яндекс сервисы (видно где-то есть базворд го)
Помню как был рост на тиобе, когда появилась игра go.
Да, бот сломался, триггер сработал на котлин вместо го.

Еще немного и будет открыта дорога в энтерпрайз
бабло в пути
Нужно только потерпеть...
Нарисует. У меня 6 лет в резюме было нарисовано.

Конечно, шансы есть. Успехов!
>Звездеж, жабист/шарпист со спрингом/asp.net за минуту разворачивает то, что на го еще даже не написано еще.
А потом жабист идет смотреть 3 часа конференцию в которой три долбоеба и крупных банков в синих рубашках с бейджиками обсуждают как нужно правильно написать конфиг для очередной ОРМ чтобы не было N+1 и чтобы вся БД не выгружалась в память.
> главная сложность в современной разработке это не синтаксис.
Это верно подмечено, жабисты и без синтаксиса нахуевертят сложностей
>А потом жабист идет
Жабист идет нахер, а вот у шарпистов есть серия стандартов в ОРМ, а не зоопарк васянских либ, и понимаешь в чем фишка, ты либо можешь это использовать либо нет. Это выбор, а в го, извини, выбора нет. И все равно какой-то
мудень забудет сделать проверку err = rows.Err()
Там в шарпах тоже статик бинарь.
В голанге шедулер корутин, в шарпах stackless стейт машина, он даже не знает про корутины.
Мб уже объяснили, или сам отрыл, но мой совет такой: возьми и почитай исходный код стдлибы. Вот сядь и прочитай. Построй связи между компонентами, посмотри что и как вызывает и в какой последовательности. Мне в свое время понять стандартный http помогло именно это.
В добавок к предыдущему докину, что без личного прощупывания хуй поймешь отличия всех Handle, Handler, HandleFunc, HandlerFunc и т.д. Ну и гуглить не забывай, тоже важный момент, инфы навалом
> как и дженерики
Отдельный мем. Их где-нибудь по итогу использовали адекватно? Я вроде в стандартной либе где-то видел один раз и все.
Они оказывается еще до кассы в пятерочке такими злыми становятся
Го можно терпеть в бигтехе за бабло, но делать пет проекты, мы че копрофилы?
Телеграм бота писал. Бот на ключевое слово, постил в чат картинку.
А что на гоу кроме круда и cli утилиты сделать можно?
Чет задизморалился на этой теме.
Что-то интересное превращается в обертку системных либ
Поймал себя на мысли, что не понимаю как из errgroup получать результаты функции. Если жаваскриптеры есть, то мне нужен аналог Promise.all и Promise.allsettled.
Думаю может начать писать какую-то обертку даже свою с каналами.
Системные языки это языки с прямым менеджментом памяти.
Если бы не положили бы болт на арены, то с натягом можно было отнести к низкоуровневому (как спаны в си-шарпе) но никак не к системным. Вроде в го даже ансейва нет.
Языки с низкоуровневыми возможностями
C#, Свифт, Котлин.нейтив
Системные языки
C/C++, Rust, Zip (и прочая экзотика)
>Вроде в го даже ансейва нет.
Есть конечно, и ручная аллокация/деаллокация там. И подключение библиотек на С с вызовом функций из них.
https://github.com/0xcafed00d/joystick
Вот держи байтоебство. На го этим заниматься можно.
Можно даже на уровень IP спустится (ниже TCP и HTTP) и от туда ручками пакеты заворачивать.
Другое дело, что занимаются таким тут реже, и я чаще вижу c-биндинги, проброшенные в го, чем чистое го-байтоебство.
Наверное байтоебство неправильный мем, с байтами ты буквально ебешься когда сырую utf-8 строку гоняешь или 8-бит буферы. Тут скорее ебство с сырыми указателями.
Ручное управление есть и просто в ансейфе. Дёргание функций из сишных либ либо да, через пакет CGo, либо с компилятором GNU, там вообще напрямую и гошные функции можно из си дёргать.
В примере выше дергание чистых си-функций только в файле для osx (darwin). Линукс не использует си, если посмотришь исходники.

1280x720, 0:09
Блять, у меня горит нахуй от того что не могу понять как устроен тип string.
Вот есть переменная типа string:
1. под капотом она имеет указатель на массив byte
2. в свою очередь byte это просто обертка над типом uint8
3. но из-за того что строка сама по себе не массив символов а массив байтов, собственно любая попытка получить доступ к конкретному символу обернется фейлом так как ты получишь только числовое представление символа из кодировки UTF-8
4. Чтобы это исправить ты должен преобразовывать полученный конкретный байт из строки в тип string().
Собственно вопрос.
НАХУЯ НУЖЕН ТИП rune?????!!!
Ну вот нахуяяяя!?!?!?!??!??!?
БЛЯТЬ как же меня корежит и трясет....
>НАХУЯ НУЖЕН ТИП rune?????!!!
Чтобы преобразовывать строку в слайс рун и работать спокойно с символами, не ебя себе мозг.
А нельзя, потому что одна графема может состоять из нескольких кодпоинтов, лемао.

>>21928
Так бля, я накинул такой пример, я правильно понимаю что, из-за того что в byte aka uint8 aka 1 байт помещается только цифры от 0-9, латиница A-z a-z и горстка ебаных символов, любая попытка использовать иное аля кириллица, иероглифы приводит к фейлу так как в ASCII/UTF-8 они просто не прописаны, и эту проблему решает rune aka uint32 aka 4 байта который по сути имплементирует UTF-32 благодаря которому можно работать с любыми символами мира.
>можно работать с любыми символами мира.
Не совсем. Есть символы-модификаторы для д̷͊͛̌͜и̵̺̟̊а̵̝̫͍͙̊к̷̡̛̜͒̈͘͘р̵̛͍̬̍̈́и̷̺̚т̶̡͂̈̔и̵̥̉̽̂к̶̤̤͕̫̎̾͒̓ͅи̷̜̐̚, есть составные эмодзи (мужчина + черный + беременность). То есть на глаз определить, сколько байт в строке вообще не всегда возможно.
В UTF-8 есть всё. Но это тип переменного размера, поэтому руна берёт максимальные 4 байта и всё.
>>21959
Нихуя не понял....
>Но это тип переменного размера
UTF-8 он может быть от 1 до 4 байт, хорошо
>Есть символы-модификаторы для д̷͊͛̌͜и̵̺̟̊а̵̝̫͍͙̊к̷̡̛̜͒̈͘͘р̵̛͍̬̍̈́и̷̺̚т̶̡͂̈̔и̵̥̉̽̂к̶̤̤͕̫̎̾͒̓ͅи̷̜̐̚, есть составные эмодзи (мужчина + черный + беременность).
Есть такие символы для которых нужно несколько рун?
>Есть такие символы для которых нужно несколько рун?
Да. Поэтому на практике UTF-32 просто ни для чего не нужен.
>А нельзя, потому что одна графема может состоять из нескольких кодпоинтов, лемао
В ASCII такой хуйни не было!
Потому что в РФ живой рынок, много проектов с нуля пишется, а го это отличный язык как новый выбор. В странах загнивающего мира поддерживают тухлое легаси. Посмотри сколько там вакансий на ебучем Коболе и охуей.
Уровень сеньоров и тимлидов ниже.
Ну, то есть, реально есть "молодые и успешные" тимлиды считающие, что го это "улучшенный си".
Потому что го лучше всего подходит, чтобы писать разные парсеры/брутфорсы/чекеры/регеры/бомберы/подобный около-хак софт и бекенд к телеграм ботам, а у нас это все любят как нигде.
>парсеры
Что-то хоть не хуже питухонского Beatiful Soup есть на Го для парса хтмла и поиску по css селекторам в нём?
https://github.com/PuerkitoBio/goquery есть вполне неплохой аналог.
Другое дело что если тебе нужен фреймворк уровня скрейпи, то конечно лучше петухон. Хотя на го и был какой-то более тухлый аналог.
В остальном да, скрепер на петухоне напишется раза в 1.5-2 быстрее чем на го, там попроще и библиотеки приятнее.

А как ты так узнал? Кажется, в "валлед вордле" вообще нет единой вменяемой доски объявлений для вакансий.
Все пишется приятнее на петухоне. Мне интересно, только у нас ставят выше комфорт разработки с желанием сэкономит кабану на железке? Или заграницей так же?
Читать 500 страниц про "переменная это коробочка, куда мы кладем данные" как-то не хочется.
В чем смысл? Язык за выходные учится
>Кто-нибудь с других языков в Го перекатывался?
Главный вопрос - зачем это добровольно делать?
В среднем на российском рынке на Го больше зп и пишутся новые проекты. На джаве и питухоне ситуация хуже - много чего находится в состоянии вечной поддержки легаси и зепки ниже.
Документация на оф сайте, плюс чатгпт для тупых вопросов. В го самое сложное это горутины и ее паттерны. Если катишься с js, то придется ещё про синхронизацию изучать, всякие мьютексы и семафоры.
Причина та же как и везде с го. Используя го можно затыкать боттлнеки чуть более производительным софтом. Одно дело написать за вечер скрепер Амазона и забыть, собрав данные на сегодня.
Другое дело писать сложную систему с кучей скреперов разных сайтов, масштабировать в кубернетисах, экономить деньги кабану и прочее. В какой то момент 100 мб в ОЗУ на питон может стать затратнее чем 10 мб на говне.
Но я согласен что это не всем надо.
ЗП больше потому что нужны сеньки, которые разгребут бойлерплейт предыдущих модных и молодежных
Яработал. Гоферы через бойлерплейт и самописульки умудрились сделать легаси код еще хуже чем на жабе, казалось бы куда хуже.

js/ts/php/python-макака, 8 лет опыта
Юзкейсы. Почему-то неочевидно, когда использовать указатель при передаче аргумента в функцию, а когда не использовать. Когда обявлять переменную как ссылку, а когда нет.
Ну я даже хз, как это может быть неочевидно. В одном случае ты передаёшь сам объект, состояние которого функция может как-то поменять. В другом ты передаёшь функции копию, и похуй, что она там с ней делает, у неё свой такой же, а твой у тебя остался.
Запомни главное. Когда ты передаешь значение в аргумент функции - у тебя это значение копируется. Не важно: строка или структура.
Это обычное поведение, как в си. Если ты хочешь чтобы функция мутировала твой аргумент - надо передавать ссылку на переменную (&). А чтобы указать функции что она принимает ссылку используется (*).
Почитай про указатели в си, тут тоже самое, но без арифметики.

https://go.dev/play/p/rekATAlU1Ow
Допустим у тебя есть переменная типа "структура с некими полями". Ты хочешь отправить эту переменную в функцию так, чтобы функция изменила значения её полей. Соответственно, если функция принимает переменную не по указателю, то в туда скопируется значение самой переменной - в данном случае структура, т.е. по сути, просто создастся новая такая же структура. Когда выполнение функции закончится, ты обнаружишь, что поля переменной, которую ты передавал в качестве аргумента в функцию, остались прежними. А тебе нужно, чтобы функция меняла значения полей исходной переменной, поэтому тебе придётся отправить её по указателю - всё просто.
Ну и плюс, есть более сложные кейсы с использованием указателей. К примеру, рекурсивные структуры данных - типа списков, деревьев и всякого такого.
> - Работа с ошибками. По факту предлагается на выбор два сорта говна, которые можно еще и смешивать между собой - sentinel values и создание кучи абсолютно одинаковых структур под разные типы ошибок. Первый подход еще можно использовать без рвотных позывов благодаря errors.Is(), но при необходимости в таком случае достать дополнительный контекст ошибки начинается трахомудия. Второй подход более гибкий, если это слово сюда вообще применимо, но проверка типа ошибки через errors.As() это ебаный кал собаки, раздувающий сервисы/хэндлеры до космических размеров на ровном месте.
Ошибки не предназначены для того, чтобы их анализировать. error нужно пробросить и в итоге выплюнуть в лог. Это как исключение, только программа не вылетает.
Если тебе нужно обрабатывать ситуации, то возвращай статус коды.
>В традиционных ООП языках
Го не ООП язык.
>Ошибки не предназначены для того, чтобы их анализировать.
И как мне понять что вернуть юзеру, 40Х или 50Х? На самом нижнем уровне в каком нибудь парсере решать, что это за тип ошибки и возвращать 401?
>>29533
>>29742
Спасибо.
Отлично помог этот пример, и каким же простым он оказался, теперь я чувствую себя ещё более тупым, чем я думал. Завидую людям, которых обучали сразу с низкоуровневых языков программирования. Потому что мне теперь ещё предстоит увлекательное погружение в горутины, каналы и вот это всё.

Не парься, в любом случае твой опыт вряд ли усугубит понимание. Меня хоть и обучали в универе на низкоуровневых ЯП, но до этого я самообучался вообще хрен знает с чего - со всяких ActionScript'ов в частности.
Как только пердиксы изобретут что-то поновее и где зп будут ещё повыше.
Вроде как есть mipsel архитектура, но м.б. существует гайд, как его туда закинуть?
Горутины и каналы - это примитивы довольно высокого уровня.
Остальное можно изучить, когда почувствуешь, что тебе это понадобилось.
Смотря с чем сравнивать. Из своей практики скажу. Есть у меня пара серверов на пайтоне и ноде. Оба занимают в ОЗУ около 100-150 мб при очень небольшой нагрузке.
Схожий сервер на го в памяти занимал 10-20 мбайт, в 10 раз меньше.
То что бинарник весит 10-20 мбайт не так страшно, потому что RAM намного дороже чем HDD/SSD. При этом писать на го не то чтобы прям сильно сложнее, чем на упомянутых языках. В отличии от раста, зига или, не дай боже, чистого си.
Снова этот еблан, считающий размер хеллоуворда за основную характеристику любого ЯП
6,284%
Динамические библиотеки загружаются ОС один раз и разделяются между разными процессами так, как будто этот код часть самого процесса. Таким образом система экономит как оперативную память, так и место на диске.
>>31065
Часто можно встретить утверждение, что го якобы отлично подходит для написания консольных утилит. Однако, консольные утилиты должны занимать минимум места на диске, потому что их много (посмотрите в любой unix-системе папку /bin) и каждая такая утилита решает свою маленькую задачу. Если переписать утилиты на го, то размер ОС распухнет в 1000 раз и тогда даже террабайтных дисков не хватит. Но современным программистам плевать на ресурсы, они готовы писать на любимом языке, раздувая код в тысячи раз.
Порой просто удивительно, что в 80-90-х многие программы шустро работали на слабом железе, а сейчас им подавай пк с последним процессоров, огромным диском (да и ещё и SSD!) и десятками гигабайт памяти.
>Но современным программистам плевать на ресурсы, они готовы писать на любимом языке, раздувая код в тысячи раз.
Да, всё так, всем похуй на ресурсы. У меня на VPS за 5 баксов 50 гигов диска, как-нибудь переживу тяжесть гошных бинарников.
>Порой просто удивительно, что в 80-90-х многие программы шустро работали на слабом железе, а сейчас им подавай пк с последним процессоров, огромным диском (да и ещё и SSD!) и десятками гигабайт памяти.
Гошные программы вполне шустро работают, они эффективны в плане потребления ресурсов CPU, так что здесь ты привираешь.
Всяко лучше, чем ставить (((скобочки))) в плюсах, чтобы компилятор понял, что ты не функцию объявляешь.
Успокойся, ребёнок. Каждому языку − своя задача. Да, окружение на го для ОС будет весить и жрать пиздец. Зато вся тысяча нужных утилит будет написана раньше, чем ты выловишь сегфолты в своём грепе. И бизнесу часто нужно первое. Ему похуй на стоимость железа, ему нужно чтобы в прод выкатилось позавчера.
Но тебя никто не заставляет работать на кабанов, стань системщиком и еби байты себе в удовольствие.
Так ты и так должен ставить скобочки при вызове метода. В чем проблема понять что foo.bar это ображение к полю, а foo.bar() это вызов метода? При этом локальную переменную с именем метода объявить можно, никаких проблем это не вызывает.

Потому что ты можешь функцию передавать ссылок как коллбек. Ты точно программист?

>Так ты и так должен ставить скобочки при вызове метода. В чем проблема понять что foo.bar это ображение к полю, а foo.bar() это вызов метода?
Пожалуй, ни в чём. А как насчёт примера посложнее, юный плюсовик? Создадим контейнер со своим компаратором. Ой, или мы функцию объявляем. Или нет? Помогите Даше компилятору разобраться в простом и удивительном синтаксисе, поставьте двойные скобочки.
>> Порой просто удивительно, что в 80-90-х многие программы шустро работали на слабом железе, а сейчас им подавай пк с последним процессоров, огромным диском (да и ещё и SSD!) и десятками гигабайт памяти.
Слабее железо -> больше требований к оптимизации -> работа сложнее -> меньше специалистов
Представь современный мир, если бы только чистые Си и остались
Но можно подменить responseWriter на свой кастомный, на то он и интерфейс же. В мидлваре подменить респонсрайтер на фейкреспонсрайтер, который сохранит тело в буфер, обернёт ещё раз, и вызовет уже оригинал?
>Причём тут Си?
Да ни при чём. Но очень показательно, что плюсовик даже не узнаёт свою же парашу. Не зря вас к ядру линукса не подпускают.
Было например "1,2,3,4", а стало "4,1,3,2". При этом функционально все работает нормально.
Это нужно как-то фиксить или так и должно происходить?
ORDER BY
Базе похуй в каком порядке выдавать результаты, если ты не указываешь сортировку.
Забавно видеть такой вопрос в го треде.
хоба
Есть какие нибудь идеи как это обойти?
> Есть какие нибудь идеи как это обойти?
Есть. Сменить язык. На Go невозможно реализовать эту монаду, как и большинство примитивов фп, особенно без использования interface{} и тайп асертов.
Дженерики в го это по сути кастрированный концепт, который скорее всего добавили по просьбам трудящихся (пока их не было постоянно стоял визг о том, как они нужны). Редко вижу проекты, где они неиронично используются, мягко говоря. А без нормальных дженериков, какие уж тебе тут монады.
Может это есть в каком-то пакете общих примитивов, который все используют в проде?
2 ИДЕНТИЧНЫХ варианта создания переменных (var, :=), различные махинации с данными - ОТДЕЛЬНЫЕ ПАКЕТЫ (strconv. прочие), функции расширения через магический синтаксис, интерфейсы...
Да что у вас не так с языком? У вас его читать почти нереально, программировать что-то еще больнее. Выглядит как-будто больной человек пытался сделать ЯП под шишками.
Горутины вообще жесть, реально какой-то шизофреник писал код под мефедроном, закусывая трусами школьниц.

>Горутины вообще жесть, реально какой-то шизофреник писал код под мефедроном, закусывая трусами школьниц.
То ли дело асинк/авейт эталон элегантности!
suspend, collectAsState, launch, await, flow.
Люблю котлин за этот элегантный способ работы с корутинами.
>>Гошники, как вы с этим живёте?
Судя по тому что на нем пишутся отнюдь не рофлопроекты для попила бабла и в компаниях сильно выше уровнем чем "ОАО РОГА И КОПЫТА"...
Более чем отлично живем
Авито ещё забыл, там сотни гоферов и платят збс. Самокаты всякие, Островки. Го реально выстрелил на российском рынке, работы дохуя.
>suspend, collectAsState, launch, await, flow.
>Люблю котлин за этот элегантный способ работы с корутинами.
Чел! У тебя личерали весь рот в говне! Все эти launch это реально ебанная магия с неочевидными последствиями. Кто на каком пуле запускается, все эти неявные контексты и скоупы, это просто говно ебанное.
А Горутина это тупо еще один поток, в горутину и обратно все передается явно ручками. С горутинами конкурировать только вируальные треды могут, но точно не калорутины.
В го самая легкая и самая удобная и самая гибкая модель concurrency кода. Любой кто с этим спорит - долбоеб.
Охуеть, на языке, созданном для хайлоада и микросервисов, пишут хайлоад и микросервисы!
Язык представляли как system programming language, про это даже на сайте было написано. Но когда стало понятно что бинари по 10 мегабайт с gc не очень подходят для системного программирования - стыдливо убрали 😌
>system programming language
И тем не менее такие платформы как кубер и докер на нём написали. Я вот эмбед на нём пишу, на Orange Pi зерошках приложухи летают.

чтобы корабль не потонул все таки используются костыли для того чтобы укратить гарбаж коллектор
https://github.com/grafana/dskit/blob/main/ballast/ballast.go
> В го самая легкая и самая удобная
+
>и самая гибкая
А вот с этим поспорю.
Сможешь принудительно завершить выполнение горутины, узнать, крутится ли она еще и т.д?
Нет.
Гибкой такую модель определенно не назовешь.
Но удобство тут действительно есть, и легкость. Можно реально спавнить их и ничего не виснет, не вылетает. Но если бы у горутины был какой-то ID, по которому можно было бы выполнять с ней базовые операции, было бы более интересно, но тогда появилась бы возможность наделать трудно отлавливаемых ошибок, которая присутствует в других языках с фьючерами, асинк-эвейтами и этим вот всем.
В общем горутины - киллер-фича языка однозначно.
>принудительно завершить выполнение горутины
Никто из современных, безопасных языков такое не позволяет делать. Тупо потому что проблем будет больше, чем профита.
>Сможешь принудительно завершить выполнение горутины, узнать, крутится ли она еще и т.д?
>Нет.
Да, только придётся написать свой менеджер горутин строк аж на 100-200. Раздать горутинам айдишники и сделать мапу, куда по ключу из этих айдишников положить структурки с инфой о состоянии, контекст с отменой, можно коллбэков насыпать и управлять потрохами горутины − да что угодно тащемта можно.
Да что-то нихуя он не востребованный уже. Все как писали на Java и плюсах, так и пишут
> Да, только придётся написать свой менеджер горутин строк аж на 100-200. Раздать горутинам айдишники и сделать мапу, куда по ключу из этих айдишников положить структурки с инфой о состоянии, контекст с отменой, можно коллбэков насыпать и управлять потрохами горутины − да что угодно тащемта можно.
Только на практике твой менеджер соснет, когда некоторые горутины просто зависнут, потому что механизм прерывания должен быть встроен в саму горутину. Я с таким сталкивался. Когда горутина вызывает кучу кода из сторонних библиотек, активно работает с каким-то более менее сложным протоколом, хотя бы SSH. Сколько бы контекстов и таймаутов ты ни насыпал, всегда будет шанс зависания, причину которого сложно/невозможно отловить и устранить, и твой код будет иногда локаться на ожидании ответа от горутин, которые подвисли.
Первый
Хочу сделать загрузчик файлов, так, чтоб он чекал ссылки на уникальность, занимался препроцессингом, т.е. чтоб парсил страницы если нужно и т.д.
В общем тут над архитектурой надо думать, но я пока всё в одном сервисе запилю, кроме воркера непосредственно загрузчика, его вообще можно на аутсорс отдавать, например yt-dlp, а то что я буду делать это интерфейс, т.е. веб-приложение на gin, ну и хранение ссылок.

Докер
Кубер
Прометеус
Хелм
Терраформ
Минио
Vault
Etcd
Traefik
Rancher
И даже GitLab Runner
что это такое и зачем оно нужно
всю жизнь юзаю
нотепад два креста
пхп 5 недавно перешел на 7
денвер
вин рар
хдебиг
хмлхттпреквест
бэм
пхп му админ
мускуле 5.6
фар манагер
>Только на практике твой менеджер соснет, когда некоторые горутины просто зависнут, потому что механизм прерывания должен быть встроен в саму горутину. Я с таким сталкивался. Когда горутина вызывает кучу кода из сторонних библиотек, активно работает с каким-то более менее сложным протоколом, хотя бы SSH. Сколько бы контекстов и таймаутов ты ни насыпал, всегда будет шанс зависания, причину которого сложно/невозможно отловить и устранить, и твой код будет иногда локаться на ожидании ответа от горутин, которые подвисли.
Понял. Ну да, в теории такой шанс есть всегда. Но я не сталкивался, максимум контекст с дедлайном ставил и пукал 500, если долго крутит.
отдает по запросам джсоны
но встал хуй вопрос а что взять для фронта?
пробовал htmx но тогда придется переделывать все айпи ручки чтобы отдавали html и вообще связываться с шаблонами буееее
реакт учить не хочу и не буду
что брать то?
svelte
Напиши фронт на ncurses через CGo.
Иди учи ангуляр. Во фронтенд без технологий фронтенда даже не думай лезть, бесполезное занятие.
Мне Vue3 зашёл до этого ни на каких фреймворках не писал, только с шаблонами.
Я юзал Vuetify, но судя по всему это кал и есть более крутые фреймворки, например PrimeVue (но это не точно).
Пишется легко, если не нужна какая-то крутая логика, но для этого можно к гопоте обращаться за советами
htmx это топ если не маляр - не нужно засирать свою репу всяким фронто говном, просто отдаешь файлики и кайфуешь. Если нужна красивость, то tailwind, который можно без ебучих js зависимостей просто выкачать и так же отдать или через cdn дать юзеру.
Современный JS вполне себе может дергать апишки, да и манипуляции с DOM там ну +- на уровне JQuery. Почему бы не писать на нем?

Я сделал библиотеку, которую юзаю в нескольких своих проектах и зачем-то решил закинуть ее на гитхаб, чтобы не копировать файлики, а делать go get, import, все "по красоте".
Суть в том, что я не могу заставить го подтягивать новую версию своей охуенно нужной либы. Закоммитил в master, изменения есть. Пробовал go clean-modcache, затем go get -u github.com/путь/к_библиотеке - бесполезно. Я уже один раз с этим столкнулся, но как-то хуй пойми как через очко победил это, но не могу вспомнить как, просто блять как ебанутый нажимал везде и вставлял команды.
ПАМАХИТИ
1. Удалил go.sum #не уверен, что необходимо
2. Удалил ссылку на свою либу из go.mod
3. $ go clean -modcache #без этого один хуй тянет старую версию
4. $ go get -u github.com/user/lib
5. $ go mod tidy
Вопрос, а менее идиотски это можно было реализовать?
Почитать документацию.
Что-то мне подсказывает, что год мод качает последний тэг, он у тебя уже есть, поэтому перекачки не происходит. Правильное решение - выпустить тэг. Рабочее - апдейтнуть по хэшу коммита (@hash после названия либы).
Потому что должна быть опция скачать самую новую версию (последний коммит), а не хардкодить трехэтажные, человеконечитаемые версии в go.mod.
Тегов у меня нет.
Ты совсем читать не умеешь? Опция есть, go get githib.com/zalupa/hui@last-hash, все, качается (мб форма слегка отличается, но идея такая).
Версия это тэг, коммиты сами по себе на версию не тянут.
Сначала научись читать на русском, потом на английском, только потом воняй на го мод блеать.
Мне кажется возможность писать микросервисную/монолитную архитектуру не определяется языком, а так да
Ну, как будто бы у каждого языка есть "своя парадигма", куда может вкладываться как парадигмы в общем понимании, так и стили программирования.
Например С и плюсы были созданы для монолитов, Джава, Сишарп - для ООП, а вот го это язык для микросервисов. И у меня такое чувство что если начать писать на нём монолит то как будто бы это неправильно

При чем тут package rand если он даже не юзается в примере. Ничего себе крученые подачи с ходу

Last element это красное или фиолетовое
Смотри, ты можешь писать и какать независимо друг от друга. Сначала пописал, потом покакал. Покакал, но не пописал. У тебя может быть запор, но при этом писать ты можешь и тп. В точности также работают микросервисы
Почему то вообще не слышал отдельного слова для таких сервисов в отрыве от го.
Почему го хорош для них, и что было стандартом для них до го?
>что было стандартом для них до го
Ещё 8-10 лет назад этот ёбаный канцер просто не был массовым.
Потому что сначала рассчитываются аргументы функции, а потом уже вызывается сама функция. У тебя при рассвете аргумента происходит принт, вот он и выводится. А уже потом после того как все pow отработали делается println.
Тэг актуальный выкатывал?

Тоже что и сервис, но поменьше - принципиальной разницы нет. Короче, приложение, которое постоянно запущено. Когда говорят "микросервисная архитектура" - имеют в виду, что они обновляются и деполятся независимо друг от друга, да и всё, пожалуй.
Это методология разработки для стартапов, буквально из говна и палок. Суть в том, что ты нанимаешь любых васянов с разными стеками, кого найдешь, каждому выделяешь сервер-песочницу и они быстро-быстро что-то пишут, не мешая друг другу. Поскольку 99% стартапов никогда не выйдут в прод, можно писать что угодно.
Разрыв соединения - это абстракция, там же нет подключения по одному проводу. Пакеты передаются по физически разным серверам каждый раз по-новому. К тебе приходит какой-то пакет с каким-то идентификатором, ОС или сохраняет его в память или удаляет, если айди неизвестный. Соединение "живет" пока его айди находится во внутренней таблице, а сами пакеты можно слать до бесконечности - ОС их проигнорирует.
Ответ на твой вопрос - оно само "переподключится" в пределах какого-то таймаута.
Собственно читаю блайнд и вижу, что по многим отзывам дела у гугла идут плохо. Вероятно станет вторым ораклом или мертвым yahoo.
Перейдёт в опенсорс и благодаря тому, что дохуя компаний на него уже подсели, продолжит неплохо жить, продолжая увеличивать свою долю на рынке. Когда-нибудь новая корпорация расхайпает что-то новое, го начнёт стагнировать и сядет в кресло-качалку рядом с пыхой. Кароч не переживай насчёт краха гугла, лучше переживай насчёт нейросеток. Экосистема у го уже сложилась, и он будет жить долго.
А что может тебе помешать написать игровой движок или ядро ОС на го? Дерзай, успеха!
Тяжёловесный рантайм, для которого уже нужна ОС, чтобы всё работало.
А графические приложения требуют интеграции с библиотека, а в го, всё что не в его стандартной библиотеке, работает криво и медленно. Я читал, что один вызов внешней С-функции полностью останавливает всю многопоточную систему горутин.
Kubernetes
Docker
Etcd
Terraform
Prometheus
Traefik
Caddy
Consul
CockroachDB
InfluxDB
MinIO
NATS
Кстати, почему на джаве и сишарпе такое не пишут?
Потому что джава это кал, а про сишарп никто не знает, что там есть unsafe и язык кросплатформенный.
Если джава кал, то почему на ней пишут такие вещи как Kafka, Elasticsearch, Hadoop, Cassandra?
>Тяжёловесный рантайм, для которого уже нужна ОС, чтобы всё работало.
А вот тут чел захотел и по приколу пишет ядро потихоньку, ему почему-то рантайм не мешает. Потому что он открытый и не такой большой, всё можно перепилить даже в одно рыло, как оказывается.
https://github.com/gopher-os/gopher-os
>Я читал, что один вызов внешней С-функции полностью останавливает всю многопоточную систему горутин.
Тебя несколько наебали. Сами по себе эти вызовы ничего не останавливают, но из побочных эффектов усложняют работу сборщика мусора и могут продлить фазу stop-the-world, которая останавливает работу программы, но в C# точно такая же хуйня, тоже сборщик с фазой глобальной паузы, и ничего, геймеры жрут поделия на юнити, и всем норм.

>читаю блайнд и вижу, что по многим отзывам дела у гугла идут плохо
как можно быть таким дебилом
Сам не знаю, но поддерживать этот монструозный джавакал в проде то ещё приключение.
мимодевупс
Вот есть стандартный http-сервер. И на каждый новый запрос этот сервер создаёт го-рутину. И вот кол-во запросов нарастает, запросы не успевают обрабатываться достаточно быстро, а го-рутины всё спамятся и спамятся, засирая память, пока она не закончится.
https://youtu.be/3fWx5BOiUiY?t=221
А как сделать так, чтобы не память бесконечно засиралась, а просто чтобы время обработки запроса спокойно себе увеличивалось?
Первое, что надо сделать, это поставить вопрос иначе: мы упёрлись в производительность, как увеличить RPS? Ответ номер один, самый основной: сказать кабану, что нужно больше железа. Ответ номер два, архитектурный: сменить фреймворк с простого на производительный. Ответ номер три, строго после того как 2 сделано: сидеть и профилировать свою лапшу, оптимизируя узкие места. Но лучше см. 1.
Ответ по существу: в видео переполняется очередь запросов, насколько я понял. Тут ничего не сделать, нужно либо их обрабатывать, либо посылать нахуй через rate limiter/circuit breaker, иначе сервис рухнет как в видео.
>Kafka, Elasticsearch, Hadoop, Cassandra
Это начинали писать еще в бородатые годы. Лет 17-20 назад. Когда никакого гоуленга еще не было в проде. Поэтому и писали на джаве, других подходящих инструментов было не так много.
На момент 2008 года для таких проектов было мало подходящих языков. Помимо Java был C++ и C#. На крестах писать сложно и долго. Сишарп был только под винду. А, ну еще был питон, руби и пыха. Куда же без них. Но на скриптовых языках писать такое большое будет больно.
Бля аноны я заебался короче, два дня пыхтел написал свой рест сервис, получилось как по мне божественно, но как обычно мне мое поделие нихуя не нравится и теперь я каждый раз прохожу по каждому этому пункту:
1. Ахуеть как проект нравится, чувствую себя ниибаца гофером
2. Накатывает ебейший ужас от того, какое говно написал, такое ощущение что даже школьник сделал бы лучше, максимум на джуна кажется своя работа
3. Как бомжара роюсь в репозиториях чужих людей чтобы посмотреть "А КАК ТАМ У ЛЮДЕЙ", понимаю что мое не хуже
4. Возвращаюсь к 1 пункту
Скажите аночники вы тоже такое испытывали когда писали на го? Ну не я же один такой, и что думаете о моих мыслях, я все верно понимаю что эти ебучие паттерны проектирования нахуй не работают в Go? А то я травмированная джавамакака одебилевшая от спринга наглухо... Я привык что этот богомерзкий кусок говна спринг это по сути что-то такое "декларативное", то есть ты просто на голом проекте развешиваешь аннотации и расписываешь интерфейсы и все, то есть указываешь что делать и все... рест говно есть, а вот на го все придется писать руками... без паттернов, на 20 функций в одном файле которые ты можешь вызывать ото всюду и всем похуй, так ведь?
>сменить фреймворк с простого на производительный
Можешь привести пару примеров таких фреймворков?
А то я только про fiber слышал.
не проще горизонтально масштабировать....
А зачем? Попроси чатгпт, он прочитает тебе лекцию по любой теме. Меня вот тестированию научил недавно, и работе с OpenAPI.
Какой уровень экспертизы у чатгпт? Она может полную чушь выдать. Моё мнение, что по простым темам там неплохие ответы, но чем выше сложность, тем они более бредовые, потому что просто не может найти нужную инфу и начинает сочинять.
Про новый стандарт языка. Все книги написаны про древние версии го, где половины фич не описаны. Дженерики точно не описаны, ерроры, модули и т.п.
Разработчики - это не переводчики. Если бы мне нравилось переводить, то пошёл бы переводчиком.
А у нас только переводчики способны владеть несколькими языками?
Читать техническую литературу, это даже не рядом с быть переводчиком. Особенно сейчас когда есть электронные словари и переводчики. Если ты не осилил такой несложный навык, то ты профнепригоден. Иди в 1С.
Меньше слушай всяких инфоцыган, которые форсят эту дурь про обязательный английский, печатать слепым методом, использовать вим или емакс и прочую чепуху.
Почему тег не указан и в прошлом треде нет ссылки на новый?
Чел ты реально тупой и не понимаешь элементарных вещей.
Так сложилось исторически что почти всё айти общается на английском языке. Документация на английском, книги пишутся на английском, всё комьюнити общается на английском. По английски обшаются все, и американцы, и немцы, и индусы, и японцы, и русские те кто поумнее.
Да есть переводы на русский язык, но их крайне мало. Ты сам привёл пример. Тикет разработчику библиотеки на русском не напишешь. 99% SO на английском. Основные конференции на английском. Ты просто отрезаешь себя от 99% инфы.
>Меньше слушай всяких инфоцыган, которые форсят эту дурь про обязательный английский
Про то что в айти нужен английский говорили ещё лет 20 назад. Английский на уровне чтения документации было в каждой первой вакансии.
Ага, а ещё программа - это текст, поэтому для максимальной производительности нужно уметь быстро его печатать, а достичь этой скорости можно только в vim и emacs. Если не печатаешь как секретарь-машинистка 100500 символов в сек, то значит не программист.

Господи, гошники, вас нормальные коды писать не научили, что это за параша?
Официальная либа для RabbitMQ бля, миллион параметров из буллов, идущих подряд, так еще и с приставками no
Собсна, вопрос в том, как там с востребованностью этого вашего го на срыночке в 2025 (сам я помидор 300 к/наносек, естесна)?
А то не хотелось бы углубляться в технологию, которую в продукшоне три калеки используют.
>как там с востребованностью этого вашего го на срыночке в 2025
В России это сейчас №1 технология для бекенда. Все бигтехи и весь крупняк большую часть новых проектов начинает именно на Го писать.
Даже в моей помойке в прошлом квартале начали легаси монолит распиливать на гошные микросервисы недавно. Сам монолит родом из начала 10х годов был.
За пределами России Go не особо популярен. Так что если хочешь свалить в Германию по блюкарте, то лучше джаву учить или python. Там сильно больше легаси проектов, которые никто не переписывает, поэтому сильно больше старых технологий до сих используется активно.

>Почему автор языка vlang (клон go) русский, но на своём сайте вся написал на английском?
Чтобы отсеять таких дебилов как ты. vlang у него клон go

Не доводилось читать
Бля, даже сишники уже перестали так писать, господи помоги мне пережить это...
Посколькоу голенг популярен в РФ нужен клон от 1С
пакет главная
импорт "фмт"
функ главная() {
фмт.Печатьстр("Привет, Мир!")
}
Кстати, сделать не сложно в виде простого препроцессора. Тут буквально замена слов 1 к 1.
А вот что сложно - это переписать всю документацию и учебные материалы.
Неиронично согласен, библиотека для реббита одно из худших говен с которыми приходилось работать на го. Понятно, что в го нет nullable и необязательных параметров, но это обходится config структурой.
Хуй знает кто и как это писал и выдумывал. Больше на proof-of-concept похоже, чем на реальную библиотеку. А аналогов (рабочих) этой хуйне нет.
Если несколько параметров имеет одинаковый тип - этот тип можно указать один раз в конце цепочки.
Мне такой подход не нравится, я больше избытычность люблю (явное лучше неявного).
> Если несколько параметров имеет одинаковый тип - этот тип можно указать один раз в конце цепочки.
Как будто бы охуенный подводный камень для трудно уловимых ошибок, не?
IDE тебе и так подсветит какого типа какой аргумент. Ну и никто не заставляет тебя так писать.
А вообще если много параметров, то проще сразу конфиг структуру прописать, чтобы у тебя и значения по-умолчанию были, и расширяемость без проблем.
>Посколькоу голенг популярен в РФ нужен клон от 1С
1C это клон FoxPro.
А клон Го должен сделать Яндекс, назвать его Поехали и поручить разработку логотипа Артемию Лебедеву. Вот тогда будет скрепно!
У тебя строго типизированный язык. Тебе компилятор ебло оторвёт, если попытаешься подобное ему скормить
А в go можно динамически менять тип переменной? Я что то пропустил в патчноутах?
тока не надо вонять про пустой интерфейс и any
Переучиваться в общем случае всегда худший вариант, если твои текущие умения уже приносят деньги, которые тебя устраивают.
Тот у которого память течет?
Изучаю Go, хочу на нем пописать петы. Но как в реальности с бд гошники работают непонятно. В пыхе, например, есть стандарт симфонийский - доктрина, есть элокент в ларе. А в Go что?

This is just my opinion as someone who's spent more than a year with go and several years with Java. I tried Go first, and did the whole "idiomatic" Go, approach. I tried it back in the "pure" days before Generics came about.
I would like to preface it by saying that you can definitely build successful products in Golang. This cannot be discussed as it's being done. What follows is my own opinion, about aspects of Golang (and the Golang community at the end) that I dislike.
I have several things I would miss if I went back to Go compared to the current Maven based Java builds I do today. The first two points are the most critical.
The further down we go the less important the point.
Proper Dependency Injection
Doing dependency injection in general is considered Anti-Idiomatic-Go, and in fact I was told by another Senior Go Developer that it was not "Idiomatic" Go to do depenency injection. So under his tutelage I coded massive applications where everything was handwired together. Many of the components could not be tested independently of their dependencies.
Lack of proper package managment
The package handling in Go from the start ranks as among the worst possible setups of all the package management systems - It isn't one. It's something built to support Google's Mono Repo approach, but it does so in a horrible fashion. Setting up central repository mirrors, fixing versions, generating peer dependency graphs and all the things you need simply wasn't possible then, and it's not fully possible today either.
Setting minimum version as default in the newer approaches also sucks a lot of developer joy out of me just thinking about it.
Junior Devs (and quite a few Senior Devs) don't care about dependency versions - As just as the code runs.
I fear that Golang Apps will be opened to a whole host of CVE's over time due to this unfortunately :(
Java's Maven and PHP's Compose are the gold standards. I hope the Golang team looks to these package management systems and basically copy it.
Domain names in package names
This is a horrible anti-pattern which Golang made standard as the "Idiomatic" way.
This means that you basically cannot make properly modular designs, where you rewrite an implementation of a module, but published under your domain name. In that case you have to hand rewrite the codebase to use your packages, instead of just using a different dependency
The "You haven't worked in large codebases" excuse
I've worked in Java codebases reaching into 750k lines of code
Those codebases were easier to read than the 50k lines of Golang code I sometimes had to deal with that pulled in 30+ dependencies and implemented all sorts of work around.
The Java code had proper errors and stacktraces so debugging what went wrong was easy. They also wrote their logs to rotated files in a structured format. And the Golang code just wrote to standard output.
Was the Go code simpler? Yes. Could a Junior Developer start working on it faster? Yes. Could I fix an issue quicker in the Java applikation than in the Golang applikation, oh very much yes.
Lack of stacktraces in the errors
Stacktraces are possible, but they have to be handrolled in the error handling. You need to make a log statement before returning an error, and in that log you need to make sure the line number, function name, file name, etc... are all used.
Lack of Function Overloading
This one really doesn't have any good excuse. I've seen people when they implement a function immediately implement up to eight different versions of it, with the argument type in the name of the function. addInt, addString, addFloat32, addFloat64, addFloatVector, add ... and so forth. And this pattern extends throughout all of the source code with little explanation.
It's standard library isn't "All you need"
It's a myth I was told often when I started. "You only need the STD seriously! Just get a package for the database driver"
Then we needed to talk to SOAP Web Service
With assymetrically signed digital signatures in XML
Then we needed to handle various web security features, and we basically had to handroll each and every one of them. Admittedly this was many years ago.
Then we needed transaction management with multiple databases
The mess of dependencies I see in some Go projects, dependencies that themselves have dependencies, is starting to remind me of Javascript community's "Did you know there's a library for that; Left padding!" chaos. Thankfully Golang devs seem just a little bit more restrained.
Lack of Generics
A collection is a collection, is a collection, is a collection. We shouldn't have to create fourty different types of a box, if all it has to do is contain items and make them accessible.
Java only barely does this right, C# is even better (no type erasure)
The lie that it is more performant than Java or C#
Both Go and Java/C# are garbage collected programs
Go has faster startup time, but while running it does tend to use more CPU
Java and C# tend to use more RAM and have slower startup time
With Java the startup time can be mitigated significantly with GraalVM, I recently demoed a Spring Java APP with 0.002s startup time and no "warm up"
The "Idiomatic" Go excuse
I'll understand what this means the day I comprehend what the "Pythonic Way" is. I'm always willing to discuss specifics, but the above comes off as someone waving their arms and being vague about not liking certain features.
Golang developers disagree internally about what "Idiomatic" Go is.
One Senior Golang developer once told me that copy-pasting Golang code is the idiomatic approach! :O

This is just my opinion as someone who's spent more than a year with go and several years with Java. I tried Go first, and did the whole "idiomatic" Go, approach. I tried it back in the "pure" days before Generics came about.
I would like to preface it by saying that you can definitely build successful products in Golang. This cannot be discussed as it's being done. What follows is my own opinion, about aspects of Golang (and the Golang community at the end) that I dislike.
I have several things I would miss if I went back to Go compared to the current Maven based Java builds I do today. The first two points are the most critical.
The further down we go the less important the point.
Proper Dependency Injection
Doing dependency injection in general is considered Anti-Idiomatic-Go, and in fact I was told by another Senior Go Developer that it was not "Idiomatic" Go to do depenency injection. So under his tutelage I coded massive applications where everything was handwired together. Many of the components could not be tested independently of their dependencies.
Lack of proper package managment
The package handling in Go from the start ranks as among the worst possible setups of all the package management systems - It isn't one. It's something built to support Google's Mono Repo approach, but it does so in a horrible fashion. Setting up central repository mirrors, fixing versions, generating peer dependency graphs and all the things you need simply wasn't possible then, and it's not fully possible today either.
Setting minimum version as default in the newer approaches also sucks a lot of developer joy out of me just thinking about it.
Junior Devs (and quite a few Senior Devs) don't care about dependency versions - As just as the code runs.
I fear that Golang Apps will be opened to a whole host of CVE's over time due to this unfortunately :(
Java's Maven and PHP's Compose are the gold standards. I hope the Golang team looks to these package management systems and basically copy it.
Domain names in package names
This is a horrible anti-pattern which Golang made standard as the "Idiomatic" way.
This means that you basically cannot make properly modular designs, where you rewrite an implementation of a module, but published under your domain name. In that case you have to hand rewrite the codebase to use your packages, instead of just using a different dependency
The "You haven't worked in large codebases" excuse
I've worked in Java codebases reaching into 750k lines of code
Those codebases were easier to read than the 50k lines of Golang code I sometimes had to deal with that pulled in 30+ dependencies and implemented all sorts of work around.
The Java code had proper errors and stacktraces so debugging what went wrong was easy. They also wrote their logs to rotated files in a structured format. And the Golang code just wrote to standard output.
Was the Go code simpler? Yes. Could a Junior Developer start working on it faster? Yes. Could I fix an issue quicker in the Java applikation than in the Golang applikation, oh very much yes.
Lack of stacktraces in the errors
Stacktraces are possible, but they have to be handrolled in the error handling. You need to make a log statement before returning an error, and in that log you need to make sure the line number, function name, file name, etc... are all used.
Lack of Function Overloading
This one really doesn't have any good excuse. I've seen people when they implement a function immediately implement up to eight different versions of it, with the argument type in the name of the function. addInt, addString, addFloat32, addFloat64, addFloatVector, add ... and so forth. And this pattern extends throughout all of the source code with little explanation.
It's standard library isn't "All you need"
It's a myth I was told often when I started. "You only need the STD seriously! Just get a package for the database driver"
Then we needed to talk to SOAP Web Service
With assymetrically signed digital signatures in XML
Then we needed to handle various web security features, and we basically had to handroll each and every one of them. Admittedly this was many years ago.
Then we needed transaction management with multiple databases
The mess of dependencies I see in some Go projects, dependencies that themselves have dependencies, is starting to remind me of Javascript community's "Did you know there's a library for that; Left padding!" chaos. Thankfully Golang devs seem just a little bit more restrained.
Lack of Generics
A collection is a collection, is a collection, is a collection. We shouldn't have to create fourty different types of a box, if all it has to do is contain items and make them accessible.
Java only barely does this right, C# is even better (no type erasure)
The lie that it is more performant than Java or C#
Both Go and Java/C# are garbage collected programs
Go has faster startup time, but while running it does tend to use more CPU
Java and C# tend to use more RAM and have slower startup time
With Java the startup time can be mitigated significantly with GraalVM, I recently demoed a Spring Java APP with 0.002s startup time and no "warm up"
The "Idiomatic" Go excuse
I'll understand what this means the day I comprehend what the "Pythonic Way" is. I'm always willing to discuss specifics, but the above comes off as someone waving their arms and being vague about not liking certain features.
Golang developers disagree internally about what "Idiomatic" Go is.
One Senior Golang developer once told me that copy-pasting Golang code is the idiomatic approach! :O

Хочу перекатиться в бекенд к голангистам. Апишки делать нравится. На питухоне делал и неоднократно. Контейнеры умею поднимать и сопровождать. За orm шарю. С чего начать?
>Что скажете?
Автор текста делится своим опытом работы с языком Go (Golang) и сравнивает его с Java, выражая ряд критических замечаний. Вот основные моменты:
Успешность Go: Автор признает, что на Go можно создавать успешные продукты, но выражает недовольство некоторыми аспектами языка и сообщества.
Проблемы с Dependency Injection: В Go dependency injection считается анти-идиоматичным, что приводит к сложностям в тестировании и поддержке кода.
Управление пакетами: Система управления пакетами в Go, по мнению автора, одна из худших. Она не поддерживает централизованные репозитории, фиксацию версий и другие важные функции, что может привести к уязвимостям в будущем.
Имена пакетов с доменными именами: Это усложняет создание модульных проектов и переиспользование кода.
Сложность работы с большими кодовыми базами: Автор отмечает, что даже небольшие проекты на Go с множеством зависимостей могут быть сложнее для понимания и отладки, чем крупные Java-проекты.
Отсутствие стектрейсов в ошибках: В Go стектрейсы приходится создавать вручную, что усложняет отладку.
Отсутствие перегрузки функций: Это приводит к дублированию кода и усложнению его поддержки.
Стандартная библиотека Go: Миф о том, что стандартной библиотеки Go достаточно, развеян опытом автора, которому приходилось самостоятельно реализовывать множество функций.
Отсутствие Generics: Это вынуждает создавать множество типов для однотипных задач.
Производительность Go: Автор опровергает миф о том, что Go быстрее Java или C#, отмечая, что Go использует больше CPU, а Java и C# — больше памяти.
Понятие "идиоматичного" Go: Автор критикует расплывчатость этого понятия и отсутствие единого мнения среди разработчиков.
В целом, автор считает, что Go проще для начинающих, но менее удобен для сложных проектов и профессиональной разработки по сравнению с Java.
>Что скажете?
Автор текста делится своим опытом работы с языком Go (Golang) и сравнивает его с Java, выражая ряд критических замечаний. Вот основные моменты:
Успешность Go: Автор признает, что на Go можно создавать успешные продукты, но выражает недовольство некоторыми аспектами языка и сообщества.
Проблемы с Dependency Injection: В Go dependency injection считается анти-идиоматичным, что приводит к сложностям в тестировании и поддержке кода.
Управление пакетами: Система управления пакетами в Go, по мнению автора, одна из худших. Она не поддерживает централизованные репозитории, фиксацию версий и другие важные функции, что может привести к уязвимостям в будущем.
Имена пакетов с доменными именами: Это усложняет создание модульных проектов и переиспользование кода.
Сложность работы с большими кодовыми базами: Автор отмечает, что даже небольшие проекты на Go с множеством зависимостей могут быть сложнее для понимания и отладки, чем крупные Java-проекты.
Отсутствие стектрейсов в ошибках: В Go стектрейсы приходится создавать вручную, что усложняет отладку.
Отсутствие перегрузки функций: Это приводит к дублированию кода и усложнению его поддержки.
Стандартная библиотека Go: Миф о том, что стандартной библиотеки Go достаточно, развеян опытом автора, которому приходилось самостоятельно реализовывать множество функций.
Отсутствие Generics: Это вынуждает создавать множество типов для однотипных задач.
Производительность Go: Автор опровергает миф о том, что Go быстрее Java или C#, отмечая, что Go использует больше CPU, а Java и C# — больше памяти.
Понятие "идиоматичного" Go: Автор критикует расплывчатость этого понятия и отсутствие единого мнения среди разработчиков.
В целом, автор считает, что Go проще для начинающих, но менее удобен для сложных проектов и профессиональной разработки по сравнению с Java.
По большей части устарело, там где не устарело - в основном булшит.
Насколько я знаю принято чистые sql запросы кидать, орм - моветон
Если общее понимание it есть, то пробегись по шапке быстро, чтобы понять синтаксис. Потом чтобы прощупать бек иди на ютуб и посмотри видосы типа "Сервис заметок на го" - научишься базовые круды лепить. Можешь видосы Тузова посмотреть. А дальше уже только вручную тыкаться да решать что тебе больше нравиться из подходов. Условно какую либу использовать для крудов и т.д.
> 4 года работаю дата инженером
Раз уж так удачно забрел к нам, можешь, пж, ответить на один вопрос. Щас временно стал de и строю хранилище данных для своей компании. Нужно данные для аналитиков одном месте собирать (из црмок в основном).
Скажи пожалуйста, везде говорят про всякие модели Кимбала, Снежинки, про какие-то слои в DWH. Это прям реально важная и практичная вещь? Просто со стороны выглядит как-то не очень, как что-то сверх архаичное. Я просто хотел через airflow полностью перетягивать данные в базу в чистом виде и там формировать представления (через матвью) и уже их отдавать аналитикам.
Спасибо за ответ по голангу.
> Скажи пожалуйста, везде говорят про всякие модели Кимбала, Снежинки, про какие-то слои в DWH. Это прям реально важная и практичная вещь?
Если хранилище будет загружаться 10+ DE то важно. Если начнёте все тупо в одной схеме лепить - охуеете через полгода. Кимбал, Инман описывает идеальную картину. Часто достаточно создать слой сырых данных из источников (RAW) и слой витрин (DM). В RAW как есть снапшотами льёшь данные из источников раз в сутки. В DM делаешь SCD type 0, SCD type 2. Также делаешь песочницу чтобы аналитики могли у себя на коленке адхоки считать.
Если прям у тебя терабайты данных и сотни табл, то сложнее. Гугли Data Vault 2.0. Там уже более многоуровневая тема. Слой RAW такой же, слой операционных данных - там где лежит историчность, слой бизнес данных - источник правды, слой регулярных пользовательских данных - команды будут свои DM лепить.
>Я просто хотел через airflow полностью перетягивать данные в базу в чистом виде и там формировать представления (через матвью) и уже их отдавать аналитикам.
Лучше через таблы обычные, чем материализации. Но осиль SCDT2, чтобы хранит историю с датами (from, until).
Спасибо за развернутый ответ
А работа со слоями это условно переливание данных туда сюда внутри ДВХ? Условно загрузил новые данные в одну таблицу, там их базово трансформировал (условно убрал пустые строки) и потом смерджил с основной таблицей по этому источнику? И только после разливаешь подобным образом по DMам
> А работа со слоями это условно переливание данных туда сюда внутри ДВХ?
Оно в одну сторону как правило работает. Только вперед. RAW ты вообще не трогаешь. И не фильтруешь. RAW это чистый слепок. А дальше уже дрочеш как хочеш. К слову из одних DM можно делать другие DM. И тогда по факту у тебя первый слой DM можно можно назавать Stage.
Чатики на вебсокетах и прослойка между бд+http чтобы жсон отдавать? К тому же даже мускл напрямую может жсон отдавать, как и другие бд без прослойки
Что еще на работе пишите?
Я вот ебал бизнес-логику на функциях писать, с этого начинал поэтому ебал ебал я процедурный стиль и он меня ебал
Я вот думаю учить или не учить его.
Сейчас на работе переписываю некоторые древние сервисы с плюсов на го
Ноль хайлоада, 100% кайфа
> Я вот ебал бизнес-логику на функциях писать
а на чем ты ее еще писать будешь?
>Я вот думаю учить или не учить его
Го учиться за неделю максимум, особенно если ты не совсем зеленый и что то уже писал в своей жизни
>а на чем ты ее еще писать будешь?
На ООП языке с компонентами, с сервисами, с репозиториями и DIP из солид и адаптерами. А на чем еще? Один раз ООП попробушь нормальный, потом на процедурный стиль смотреть не сможешь.
Вот я и думаю нахой мне этот го. А нужен ли.. Вебсокеты вот нужны но логику на функциях писать пиздец.
try/catch хоть есть там?
>Один раз ООП попробушь нормальный, потом на процедурный стиль смотреть не сможешь.
то то большинство новых языков от ООП отказываются (по крайней мере от наследования)
> а ООП языке с компонентами, с сервисами, с репозиториями и DIP из солид и адаптерами
То что ты функцию закопаешь внутрь абстракции функцией быть не перестанет, компоненты\сервисы\репозитории\адаптеры за тебя бизнес-логику не начнут писать
Но если ты в целом про нормальную архитектуру для создания абстракций, условный SOLID, он спокойно на го пишется
Если ты хочешь из го превратить spring какой нибудь то поешь говна у тебя ничего не получится
> try/catch хоть есть там?
Где там? Ты у меня спрашиваешь ради чего? В гугле не смог ввести запрос?
Ты видимо вобще зелень, так что не нужно тебе по языкам прыгать, сначала научись хотя бы на одном нормальное что то написать
> Вот я и думаю нахой мне этот го
Ты там разберись в своих мыслях сначала в следующий раз, чего ты хочешь, чего ты не хочешь, а потом уже за дела берись
>Что вы на Го пишите? Какие кейсы?
Переписываем тот понос, который высрали скуфидоны на жабе. В конце прошлого года нам удалось добиться увольнения всего отдела джаваскуфов, т.к. продакта заебали постоянные нюлы и прочие баги в проде. На текущий момент уже заменили более 50% системы. По факту уже проект потребляет на порядок меньше ресурсов и обрабатывает в три раза больше запросов с минимальным лэтенси. Скуфидонов уволили по собственному, разумеется. Но там одно старичье было 30+
>продакта заебали постоянные нюлы
Ахаха, теперь там не null, а nil. Все по-другому! Ошибок нет совсем ну, если все-таки err = nil
Школьник, решил со взрослыми поговорить? Гуляй давай

>Read(p []byte) (n int, err error)
Это сигнатура функции
Что блять такое (b *Reader) перед ней?
(b Reader) это ресивер, означающий что это метод структуры Reader
перед названием структуры означает что внутри этого метода ты обращаешься к экземпляру b по указателю, т. е. можешь менять его состояние
Т.е. это своего рода определение кастомного/перегрузка существующего метода для инстанса ридера а ★b внутри него выступает как this/self?
Не совсем понимаю что ты имеешь в виду под "существующим", ты просто определяешь что у объекта типа Reader есть метод Read
Перегрузок в Go как таковых нет, есть перекрытие родительского метода, это вроде разные вещи, там все на встраивании одного в другое сделано.
Поизучай в дополнение про интерфейсы, это маст хев
Тише, скуфидла, тише.. У нас в команде самый старший это лид и ему 27
> VS Code
Да, его+плагин за глаза хватает. К тому же ручками потрогаешь всякие переменные окружения и т.д.
В питоне я хотя бы один try-except на всю функцию могу написать, а не заливать в гит +10000 -0 на 95% состоящего из if err != nil
Чел, ты же в курсе, что в промышленном мире эмбед устройство это обычно какой-нибудь STM32 на Cortex с 50мгц процессором? Туда максимум Си, с++ и Раст влезут. Для таких задач ГО знатно пососет. А для жирного Raspberry Pi и Питон сойдёт.
Хочу вкатится, но слишком заебан после основной работы чтобы переучиваться на новый яп.
мимо-пхп-чмоня-битриксоид
Хз что здесь учить. Выучил всё за неделю, ещё столько же потратил на 2 пета, только на прошлой неделе было 4 тех собеса когда по ноде полный посос в найме.
Так же как и в горане
У тебя есть рантайм, периодически (от роста хипа) запускается gc (2 итерации: маркировка и высвобождение. Во время работы будут STW), засыпвет до следующей итерации.
Не, как GC работает я понимаю. Я спрашивал о том, как он работает в бинари который я могу скинуть на другой комп где сам го даже не установлен. Он получается встраивается в сам бинарь?
Ну это же пиздец. Стоило кукарекать на жаба-аннотации, чтобы высрать такое же, но гораздо хуже?
Это не аннотации аннотации в го выглядят по другому, это директивы компилятора. И он они ± так везде выглядят кроме джавы где их нет.
Директива компилятора, указывает ему как надо компилировать код. Там возможно много вариантов, но конкретно в directive.go компилятору дается указание не инлайнить код.
Например если у тебя есть примитивная функция
func add(x, y int) int { return x+y }
то компилятор просто вставит код функции в место вызова и полностью уберет функцию, так будет гораздо быстрее работать. А директива
//go:noinline
говорит, что так делать нельзя и надо оставить функцию и вызов.
Компилятор джава таким не занимается, потому там нет директив компиляции и это достаточно бесмысленно. Есть аннотации которые влияют на компилятор, но там другой механизм. В основном это или проверки типа @Override, или постпроцессинг AST типа ломбока. Но в любом случает у тебя в Го компилятор создает единый исполняемый файл, а в Джава - один класс, который не ясно кто и как будет вызывать.
Балуна какого нибудь послушай, разберешься думаю
Не вижу никаких проблем в самих директивах компиляции. ДК это инструмент для тонкой настройки и они не предназначены для использования в обычных приложениях, так же как и unsafe. И ишью это просто замечание, что кое-кто слишком увлекся ДК.
Так Кох говорит, что нам надо быть осторожными, в изменении сигнатур из INTERNAL, т.к мы можем сломать кому то работу стороннего пакета. Это же тупо, что вы дизайните инкапсуляцию в ЯП, потом даёте юзверям инструмент для обхода этого механизма и теперь вам же необходимо думать шо с етим делать. Просто посмотри кол-во комментов с упоминанием ишью в курс коде. Сами себе в штани насрали
Ты не видишь проблем в том, что КОММЕНТЫ прямо влияют на код?
Если им они так нужны, почему бы просто не сделать аннотации, зачем эти сверхманевры жопой?
Какая нахуй разница как делать эти директивы, это вопрос синтаксиса, которым будут пользоваться полторы калеки
Ну //go:embed пиздец удобная вещь, для хранения swl скриптов. Постоянно на проектах вижу
>Почему за 2024 не вышло ни одной новой книги по Go? Язык всё?
Как это не вышло?
Go Recipes for Developers - Декабрь 2024
Cloud Native Go, 2nd Edition - Октябрь 2024
Automate Your Home Using Go - Август 2024
System Programming Essentials with Go - Июнь 2024
Build an Orchestrator in Go (From Scratch) - Апрель 2024
Effective Go Recipes - Апрель 2024
Mastering Go - Fourth Edition - Март 2024
Go Programming - From Beginner to Professional - Second Edition - Март 2024
Learning Go, 2nd Edition - Январь 2024
Learn Concurrent Programming with Go - Январь 2024
Может ты имел ввиду НЕ ВЫШЛО НА РУССКОМ?
Ну, вообще, если я не ошибаюсь, есть аж 2 реализации Го на голом железе, типа тех же STM32 или даже RP2040.
Одна точно есть.
Ну и микро-питон тоже давно уже есть.
И прочее подобное.
А так-то Го - не особенно быстрый язык.
Джава если и медленнее, то не намного.
Так что, в большинстве случаев, Го просто не нужен.
В облаках для сервисов его используют из за низкой стоимости деплоймента и старт-стопов, а не за то, что он охуенно быстрый.
Если надо быстро - пишут на плюсах.
Только pure c/c++ все остальное ересь в ембедед. Микрорайон это прикол в RP. Go прикол такой в ESP32. И да, прям на голом железе нигде не пишут, везде FreeRTOS. Даже если это прямо не объявлено, все равно вызываются директивы freertos. Погугли на чем оно написано.
мимо инженер по rp2040 stm32 esp32 немного схемотехник паять умею тоже
вот есть Gin, этот фреймворк ни к чему не обязывает, но есть ли best-practices crud'ов? или без задней мысли реализовывать MVC как в спринге и не проебёшься?
>У НАС ВСЕ ТАК ПИШУТ!!!111!!!!! Я СКОЗАЛ
Это не аргумент. Все так делают/никто так не делает/везде такой фреймворк/нигде такого фреймворка нету - это нихера не значит.
Аргументация "все так делают" разбивается элементарно, достаточно найти одного человека делающего на embassy/RTIC/tock os, и уже будут не все.
>crud'ов
Вебмакака, ты вообще понимаешь, что программирование не ограничивается написанием крудов? Зачем тебе писать круды на говне? Оно же совершенно для этого не приспособлено. Пиши на PHP, там все бест практисы крудошлёпания уже давно изобрели - пол интернета на нём написано.
Суть гошки - все писать самому с нуля. С одной стороны это неплохо, фильтр на интеллект, иначе набегут дебилы как в C#. С другой стороны - ты раз за разом пердолишь свои велосипеды, а потом разгребаешь баги, снова и снова.
Выглядит скорее как фильтр на аутизм
Мне лень разбираться, что там за ишью, но то что можно криво использовать инструмент еще не значит что сам инструмент плохой или неправильно сделан.
Вполне допускаю что ребята из Голанг команды накосячили и использовали директивы компиляции не к месту.
>>77004
>Ты не видишь проблем в том, что КОММЕНТЫ прямо влияют на код?
Это не комменты, ДК используют синтаксис комментариев, но комментариями не являются. И как по мне это хорошее решение, потому что ДК будут использовать 1,5 человека и ради этого не стоит городить отдельный синтаксис не стоит.
>что ребята из Голанг команды накосячили и использовали директивы компиляции не к месту.
Ты совсем тупой? Иди осиль хотя бы первые пару предложений. Речь не о голанг команде Гугла, а о сторонних разработчиках
Можешь 15 минут пиздеть про кап-теорему. По работе ты все так же пишешь круды, как отцы на джаве 20 лет назад, но делаешь это В ХАЙЛОАДЕ.
Если писал круд для продукта которым пользуются сотни тысяч юзеров в день = работал в хайлоаде.
Для тебя как разраба почти ничем не отличается от обычного крудошлепства, разве что переодически надо подумать почему запрос стал тормозить, где накинуть индексов/инстансов/партиционировать табличку/в редчайших случаях попрофилировать код и найти там узкое место или утечку
Т.е. по сути по большей части все сводится к оптимизации работы с БД? А что касательно самого когда может быть?
Ну по коду я говорю - иногда могут утекать горутины и надо уметь находить такие узкие места через профилировщик. Или в редких случаях может расходоваться лишняя память тк аллоцируешь лишние объекты, которые можно например переиспользовать через sync.Pool
Но за мой опыт в бигтехе я ни разу не видел чтоб именно гошный код как-то жестко перелопачивали ради оптимизона. 1 раз была утечка которую пофиксил через банальный воркер пул, и 2 раз просто нашел тормозящий кусок во внешней библиотеке которую просто заменил на более оптимизированную.
А так 99% пердолинга решается на уровне БД и сетей, а не чисто внутри гошного кода.
Ну или еще приходилось 1 раз писать кэш на базе редиса чтоб снизить лишние запросы во внешнего провайдера = сэкономить на бабках и не делать лишних сетевых запросов в чужой контур которые влияют на общий SLA.
Спасибо за объяснение!
>Сап. Объяните, пж, джуну, что такое хайлоад в го
"Хайлоада" как такового не существует в природе. Единственная страна в мире, где этот термин используется - это Россия. Вообще, говорят о МАСШТАБИРУЕМОСТИ. Решение может быть либо масштабируемым (то есть способным адаптироваться под растущую нагрузку), либо немасштабируемым. Я нигде не встречал, допустим ни в США, ни в Европе, чтобы говорили "highload application".
В России под хайлоадом обычно понимается "кубернетис кластер + компилируемый язык", где пытаются выдавить максимум перфоманса. Короче говоря, это просто как детектор можешь ли ты оптимизировать свой код или нет.
По сути да.
Хайлоад - это чисто российский термин, на западе используется хайперфоманс.
Хайлоад - этол когда аутисты олимпиадники из яндекса пишут свою кафку, свой кубер, свое небо и аллаха. Получается яндекс маркет.
Хайперфоманс - это вопрос как правильно поделить систему на шарды и куда воткнуть кафку. Решается один раз на уровне архитектора. Для бекенд разработчика разницы никакой, хай перфоманс чи нехай. Если твой сервис тормозит, ты его оптимизируешь точно так же, как и 20 лет назад сайты на пхп - добавляешь индексы в бд и переписываешь код, чтобы достать все данные одним запросом.
>Хайлоад - этол когда аутисты олимпиадники из яндекса пишут свою кафку, свой кубер, свое небо и аллаха. Получается яндекс маркет.
Яндекс написал Кликхаус, а Кафку написали в Линкедыне, в обоих случаях это всё писалось для внутренних нужд. А уже потом опенсорсилось и стало стандартом в индустрии.
Если ты дефолт макака на дефолтной галере, то тогда да, для тебя весь
>Хайперфоманс - это вопрос как правильно поделить систему на шарды и куда воткнуть кафку.
И всё. Большего тебе не положено.
Чо ты учираешься по мелочам? Пофиг кто там использует эти ДК неправильно, суть не меняется. ДК тонкий инструмент, который не предназначен для повседневного использования, так же как и ансейф и ассемблер. Но они нужны и потому они есть, т.к. при правильном использования они способны улучшить перфоманс и дать возможности, которые без них будут недоступны.
Ну то есть команда языка не может редактировать рантайм языка, потому что такие умники как ты "тонко и аккуратно" завязались на приватных функциях.
>добавляешь индексы в бд и переписываешь код, чтобы достать все данные одним запросом.
Два чаю. Именно так и увеличиваю производительность. Добавляю индекс. В особо тяжёлых случаях дроблю на партиции по дням и за последний день/месяц вытаскиваю.
везде if error != nil
определение функция для структур, всё завёрнуто в кучу скобок
как это всё читать и понимать
рыготина не иначе
тут нужно в код уметь по настоящему, а не по языкам прыгать
> всё завёрнуто в кучу скобок
Обычный си-подобный синтаксис, если ты его не смог осилить то тебе точно нужно в айти?
а мне наоборот нравится ГОшный синтаксис
после питона хорошо заходит
господи всё что угодно только не джава
мимопроходил
Команде языка, надо написать, что через 2 релиза мы меняем все/какие-то конкретные внутренности и поменять их как и было обещано. В случае воя на болотах сказать, что вас предупреждали не завязываться на внутренние детали.
Всё это проходили в джаве, там куча умников завязалась на Unsafe. Их предупредили что уберут доступ, дали альтернативы, и убрали доступ. Больше во внутренности почти никто не лезет.
Это вообще не техническая проблема, а организационная. Точно так же в С++ можно завязаться на особенности какого-то конкретного компилятора, но это же не проблема языка.
>Команде языка, надо написать,
Нихуя ты умный. А они вот тебя не слушают и по всему internal ща раскиданы комментарии:
https://github.com/golang/go/blob/master/src%2Finternal%2Fbytealg%2Fcompare_generic.go#L52
Может пойдешь, в мейнтенеры залетишь и пояснишь как команда должна делать
>Может пойдешь, в мейнтенеры залетишь и пояснишь как команда должна делать
Если появятся позиции в команде, пойду.
var lock sync.Mutex
и
lock := new(sync.Mutex)
?
В Effective Go про это написано.
>dto - go-way или хуйня из под коня?
DTS
И в целом, говей это писать много кода с минимом абстракций. Так что DTS на каждый чих - это кошерно.
проиграл пиздец
ты видимо весёлый и задорный, так расскажи в принципе про архитектуру
всё проекты что видел, реализуют джавовский пыховский MVC, где есть:
1. handler/controller
2. service
3. repository
4. ДТО/модель бд
является ли это более-менее "универсальным" подходом?
скажешь что архитектура зависит от проекта и универсального решения нет - я убьюсь нахуй
вот как мне писать типовые круды на 2.5 сущности?
Так и пиши. Еще вспомни про валидацию инпута, логирование аутпута, трейсы каждого внешнего вызова, в итоге ты напишешь свой спринг, но на го.
Надеюсь в будущих версиях завезут аннотации или декораторы и тогда можно будет свой спринг пилить
Это как DTO, только вместе, object - struct.
Ты сам ответил на свой вопрос. Берешь джавовский спринг или дотнетовский аспнет и смотришь. Везде все одинаковое.
>в effective go и прочих первоисточниках ничего нет по этому поводу
Авторам го неинтересна эта ваша архитектура, им интересно ковыряться в байтах. Там литерали сидят деды и вспоминают, как в 1971 году объебались лсд и придумали while(d++=s++) Поэтому го такой кривой.
понял, благодарю!
xoxoл, спок
Если ты с нуля в программировании вкатываешься в ГОвно, то идея хуета - ГОвно живет лишь в бигтехах, куда тебя возьмут без знаний в ГОвне
Если ты знаешь какой-то язык, то ГОвно ты выучишь за 2-3 дня без учебников
У меня есть кейс для вката в ГОвно с нуля. Я уже вкатился в девопсы, но на текущем месте (и на прошлом тоже) от меня не требуется писать никакой код.
При этом в вакансиях постоянно требуется знание ГОвна.
Моя задача в том, чтобы минимально изучить ГОвно для прохождения собеса (сильно не ебут обычно) и уметь наГОвнякать на коленке очередной ненужный никому костыль (ака оператор для кубера).
Поэтому, подскажите, что почитать/посмотреть с нуля. Пока что основная проблема всех материалов либо в том, что там бесконечная индусская хелоуворлдщина, либо наоборот в том, что начинают ебать указателями и тернарными операциями, а я блядь не знаю, что это такое даже.
Короче, нужна какая-то нормальная база, как студентам дают, но на ГОвне. Есть что-нибудь такое? На изучение других нахуй мне не нужных языков я тратить время не хочу.
а с какого языка начать, чтобы с нуля вкатываться?
Так в закрепе же все есть:
- Проходишь a tour of go (попутно долбая гпт для объяснений где непонятно)
- Решаешь задачки (к примеру, с codingbat.com)
>Проходишь a tour of go (попутно долбая гпт для объяснений где непонятно)
Именно так и начал и просто пиздец как плохо пошло. Сам материал какой-то тухлый и скучный и долбание этого нейродурачка тоже продуктивности изучению не добавляет.
Не выебываюсь, просто реквестирую более годных и подробных материалов, если такие кто-то знает. Заранее благодарен
> какой-то тухлый и скучный
Так это го язык такой, лол.
Я блять тоже ради денег пытаюсь себя заставить погрузиться в это говно, но фана нет такого который есть в пыхе.
Такая же фигня. Перекатываюсь на го с божественного тайпскрипта, аж скулы сводит от уныния.
>>84320
Ебланы с двача в который раз не понимаю что го как и любой другой язык программирования это всего лишь инструмент, зачастую заточенный под определенный круг задач.
В следствие чего, эти макаки беря в руки молоток после многих лет использования пилой (спрашивается, на кой хуй они вообще меняют их горячо любимый, "божественный" инструмент) и начинают кудахтать, с какого хрена молотком нельзя пилить, после чего начинают пытаться разжечь очередной никому не нужный холивар.
Ой простите, забыл спросить сосачершу-вахтершу, можно ли высказывать свое мнение. Мань, я в курсе, для чего создавался го. То, что его притащили в крудошлепство, не моя вина, но мне с этим жить.
To serialize access, protect the data with channel operations or other synchronization primitives such as those in the sync and sync/atomic packages.
If you must read the rest of this document to understand the behavior of your program, you are being too clever.
Don't be clever.
Или когда тебе просто надо пройти ебучее интервью
>If you must read the rest of this document to understand the behavior >of your program, you are being too clever.
>Don't be clever.
Прочитал этот документ. Хз, что там сверхъестественного. Просто гошная асинронщина чуть более заумным языком.
Тоже жду выход этой книжки. Как выложат, сразу начну по ней учить го.
Чувак... Всем похую. Никто ничего за тебя делать не будет. Если не будешь читать, миру от этого не жарко ни холодно. Твои знания останутся на том же уровне. Чуда не произойдёт и дятел в академика не превратится.
очевидно чел любит сладкое
Ну так пиши сразу на дженериках. В чем проблема ?
>Получается альтернативы такому решению нет?
Если ты не пишешь какой-то приватный тип который будет использоваться только в этом пакете, то рекомендуется использовать структуру с приватным слайсом. Так можно контролировать что там с твоими данными происходит, ну и код выглядит бодрее.
https://go.dev/play/p/pQe3xLnDExx
я качусь
var previous int
func getUnconditionalValue() int {
n := previous * 17
previous = n / 3 + n % 3
return previous
}
Что думаете, прокатит или нет? Ну, с потокобезопасностью проблемы, понятно.
Начнем с того, что нихуя это не случайность, тем более "истинная"
Где..
/dev/urandom
Какие же голангеры тупые всё-таки. Я вот думаю, а в каком треде на этой борде их всё-таки больше?
С одной стороны у вас почти полноценный системный язык, но с удобным сборщиком мусора и асинхронщиной изкоробки, но при этом каждый второй дебил здесь не может постичь указатели, а когда речь заходит об основных фичах, то мозг вообще в перезагрузку уходит.
я учу я справлюсь у меня получится я смог сделать To-do в консоли
делай тоже у тебя получится ты справишься ты сможешь у тебя выйдет достойно ты не облажаешься
А как учить без книжки? Я же не знаю какие там конструкции в языке, какие типы и т.п.
А когда учишь по книжке, то последовательно проходишь все этапы и ничего не пропускаешь. Нет пробелов в знаниях.
A Tour of Go обзорно даст понимание
но я ещё видосы на ютубе смотрел
https://www.youtube.com/watch?v=eQPfHdiz_KI&list=PLc2Vkg57qmuRNHp6NNvYRVgg3OP-b5E_v
норм вроде
ты справишься с переводчиком он вроде был переведён на русский когда то, потом русский перевод убрали
МУЖИКИ
вопрос
Собираемся с другом (фронт ts/react) реализовывать наш скрепный аналог Trello на вебсокетах.
Пока вижу такой путь:
1. по быстрому разбираю многопоточку (за завтра должен управиться, сейчас вообще 0 в ней)
2. по быстрому разбираю net/http (неизвестно, с докой под рукой - должен справляться)
3. по быстрому разбираю как клепать jwt-auth в go
4. по быстрому разбираю что такое веб сокеты и что вообще с ними делать
начинаю ебашить
что-то упустил?
архитектура - разобью всё на models/handlers/services/repositories
ОРМ пользоваться не буду ибо не умею, plain SQL - норм тема
какие мои шансы не проебаться и насколько много мне ещё надо выучить/понять? консольный task-cli реализовать могу и сейчас реализовать, такой вот уровень знаний гордое нихуя
есть опыт построение калопровода-круда на джанго
цель поекта - научиться реализовывать круды на го
монолит, без кафки без хуёв
+ надо разобрать логирование
Я лучше подожду книжку. Надеюсь её сразу на торрент выложат и не придётся долго ждать.

Спешки нет, делаем для себя, но фронт знает больше меня во фронте и яростно рвётся в бой, хочу не отставать.
22 годика, магистранты.
Начинаю потихоньку накидывать ERD.
Я, блять, даже функционал Trello то не совсем представляю, лол

хотим сделать динамическую хуйню (поля таски можно crud). теперь возникает вопрос - а как нахуй?
1. JSONB - обработка не беке = норм/10
2. обработка на фронте = хуйня/10
3. mongodb, не думал, что когда то сущности будут меняться = ниебу/10, вроде норм, вроде хуйня
json в базе данных, это какая нормальная форма? видимо так и придётся делать.
Ты точно уверен, что вам нужна эта динамика? Почему нельзя просто разложить по таблицам?
Если без динамики ну совсем никак - jsonb в постгресе. Монга хуйня без задач.
>Держать json в базе - ебаное извращенство
Два чая! В базе надо держать protobuf - Google approved solution.
Но книга же ещё не вышла, источника инфы нет.