С чего начать:
- В обязательном порядке проходим "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, все, качается (мб форма слегка отличается, но идея такая).
Версия это тэг, коммиты сами по себе на версию не тянут.
Сначала научись читать на русском, потом на английском, только потом воняй на го мод блеать.