Двач.hk не отвечает.
Вы видите копию треда, сохраненную 27 ноября в 11:08.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Go-тред №32 go 3308295 В конец треда | Веб
Go или Golang — компилируемый язык программирования от создателей таких шедевров, как UTF–8, язык С, UNIX, Plan9 и других. Go поддерживает типобезопасность, имеет богатую и универсальную стандартную библиотеку и инновационные семантики одновременности: все то, что мы в индустрии называем concurrency и parallelism. На сегодня язык Go является маяком стабильности, прагматичности, де-факто представляет из себя стандарт в мире бэкенд–микросервисов и серверного оркестрирования.

С чего начать:
- В обязательном порядке проходим "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)
2 3308410
Аноны, пилите прохладные про первую работу на го
3 3308422
Ахахах, че за си-стайл поделка? Выглядит как язык для детей.
4 3308445
>>3308189 →

> Пацаны, поясните за обработку ошибок. Там выше кто-то уже спрашивал, но мне кажется тема ерроров осталась нераскрыта.


>


>Допустим у меня 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, то рано или поздно может случиться так, что в контроллере понадобится разная обработка сервисных ошибок и я пососу хуй. Если же буду заводить отдельную структуру на каждую ошибку бизнес-логики, то контроллер вырастет в размерах просто до огромных размеров и его станет невозможно поддерживать.

В общем нужны примеры как с этой хуйней бороться. Ну и то же самое с ошибками от репозитория. Тоже несколько структур заводить? И каждую из них потом обратабывать сначала в сервисе, а потом в контроллере? Тяжело....
4 3308445
>>3308189 →

> Пацаны, поясните за обработку ошибок. Там выше кто-то уже спрашивал, но мне кажется тема ерроров осталась нераскрыта.


>


>Допустим у меня 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, то рано или поздно может случиться так, что в контроллере понадобится разная обработка сервисных ошибок и я пососу хуй. Если же буду заводить отдельную структуру на каждую ошибку бизнес-логики, то контроллер вырастет в размерах просто до огромных размеров и его станет невозможно поддерживать.

В общем нужны примеры как с этой хуйней бороться. Ну и то же самое с ошибками от репозитория. Тоже несколько структур заводить? И каждую из них потом обратабывать сначала в сервисе, а потом в контроллере? Тяжело....
5 3308469
>>08445
Мимо прохожу, интересуюсь, а задача на каком то из верхних уровней тут ошибку разбирать или что?
Я работал в проекте где с нижнего уровня ошибка заворачивалась в fmt.Errorf("some_func error: %v", err)
Получался такой вот импровизированный стектрейс, а на верхнем уровне перед отдачей ошибки в response это приводилось к единой структуре ошибки
type ResponseError struct {
ExternalCode int32
InternalCode int32
ExternalDescription string
InternalDescription string
IsTemporary bool
}
По InternalCode быстро находилось верхняя точка косяка, а далее по описанию ошибки разбираем в чем проблема
По ощущениям для средних проектов хватает, дальше это можно будет улучшить через Wrap и тп
6 3308490
>>08295 (OP)
Просто мимо треда шел, но увидел третью пикчу...
А за что что вы того розового узкоглазого хомяка аж огнеметом палите? Это маскот какого-то очень очень кривоуебищного пакета в го вашем?
animatedf3zs1vy9ce5bdbccf52f68213351ca0b7920a521.gif84 Кб, 350x350
7 3308496
>>08410
Хорошая работа была. Если бы сейчас там работал, 300к бы получал в месяц, пипец.

>>08422
Откуда ты вылез..
8 3308513
>>08469

>на верхнем уровне перед отдачей ошибки в response это приводилось к единой структуре ошибки


Разверни чуть подробнее, каким образом вы выхлоп Error() приводили к этой структуре? Или респонс код и прочее сказу зашивали на этапе выброса первичной ошибки?
image.png987 Кб, 600x766
9 3308561
Человек-эксепшен на месте!
10 3308653
Лучший тред про лучший язык
11 3308662
>>08490

>Это маскот какого-то очень очень кривоуебищного пакета в го вашем?


То есть каждого пакета как и языка в принципе?
12 3308767
>>08513
Просто записывали в InternalDescription
Так как нам от ошибки ничего большего, чем стектрейс через строки и internal сode для быстрого нахождения косяка на верхних уровнях, не было нужно, то мы просто написали пачку конструкторов для разных http статусов (которые ExternalCode)
13 3309075
>>08767
Ну я это представляю так, что как минимум у меня могут быть ошибки клиента, и могут быть мои серверные ошибки. Ошибки клиента я хочу НЕ логгировать, резолвить в подходящий 4xx код и возвращать жсоном с мессаджем и какими-то полями; ошибки сервера я наоборот хочу логгировать, резолвить в 500, клиенту отдавать либо тоже что-то кастомное, либо дефолтное "что-то пошло не так", а в лог писать стектрейс и опять же какой-то контекст ошибки. При этом контекст ошибки может собираться и из контекстов обернутых ошибок
17018549163750.jpg657 Кб, 1080x1350
14 3309242
>>3308257 →
Пошел нахуй, пидар
Снимок экрана 2024-10-28 092729.png157 Кб, 1750x918
15 3309271
>>09075
Я на своем проекте пришел к такому костылю. Не знаю насколько правильно, но структура вот такая. Дальше в логгере я сохраняю Internal, а юзеру отдаю Message (который чаще всего либо стринга, либо массив с набором ошибок)
16 3309277
>>09075
Вот там в структуре есть поле ExternalDescription для юзверя и Internal для логов, такая же идея и в >>09271
17 3309415
>>09271
Стектрейс бы ещё прикреплять
18 3310353
>>09271
>>09277
>>09415
Чёт мне кажется го не для того дизайнился.
19 3310397
>>10353
А для чего он дизайнился, для перфокарт? Эксепшены в 2024 году - это общепризнанная фича, очень удобно бросить и поймать где-то наверху, а не засирать код err != nill после каждого вызова.
20 3310423
>>10397
Для замены инфраструктурных сервисов на гуглостайловом плюсоговне, а не для джава тырпрайза с джейсонами и исключенияи?
21 3310782
>>10423
@
Дедам дали волю наговнить свою мечту из 70х годов, написать свой си
@
Деды продали идею гуглу, что сделают простой си, что даже самый тупой сможет на нем писать как плюсовик +30 лет стажа.
@
Как это бывает, фантазий на новый язык было только на какие-то базовые вещи, остальное пришлось прикрутить наспех и необдуманно ибо деды умеют мечтать, а проектировать языки не умеют.
@
Идею что даже самый тупой будет писать на уровне бородатого плюсовика попытались продать кабану
@
Но что-то пошло не так
@
Теперь рынке требуются только бородатые гошники, из-за дефицита ценник как у кобола.
@
Джуны стоят внизу и облизываются.
@
Гошники на перегонки косплеят эксепшены, костылят кодогенирацию, радуются бойлерплейтам.
22 3310899
1. Какая у вас мотивация вката в го? Бабло?
2. Что вообще на гошке пишут?
3. Как ситуация с джунами?
23 3310904
>>10899
съеби, вкат закрыт
24 3310908
>>10899
Да.
Всё пишут, любой веб и всё, что связано с облаками.
Джуны не нужны. Вообще нахуй не нужны, вкат только на мидла.
animatedf3zs1vy9ce5bdbccf52f68213351ca0b7920a521.gif1,3 Мб, 350x350
sage 25 3310926
>>10899
1. Когда начинал - выбирал язык для своего проекта, на бабло вообще не смотрел.
2. Бэкенды к чему угодно.
3. Если они программисты из-за денег - наверно, им сложно.
26 3310938
>>10926

>для своего проекта


Ты сервис какой-то пилишь? Уже работал до этого прогером или имел опыт прогерства? Устроился на работу?
27 3311072
>>10899
1. Пока работа в бигтехе. Накапает опыт в резюме и съебу нахуй
2. Микросервисы в основном
3. Джунов на го не существует, кроме выпускников ВУЗов в бигехах. Все гошники - перекатыши из пыхи и джавы
animatedf3zs1vy9ce5bdbccf52f68213351ca0b7920a521.gif84 Кб, 350x350
28 3311346
>>10938
Не, делал игру-бродилку тогда, давно было. Опыта всякого имел, но на тот момент ещё не работал - на этом языке первую работу и нашёл. С тех пор устраивался неоднократно.

>>11072

>Все гошники - перекатыши из пыхи и джавы


Ну, может так было лет 5-7 назад, сейчас вряд ли.
29 3311466
Начал учить го и появились вопросы:
А че вы трай кетч вырезали к фигам, да и throw тоже? Вас не задолбало писать if err != nil { log }?
Почему вместо while loop используется for ? Честно, очень путает

Пока что это все вопросы, но они не дают покоя. Вчера плохо спал т.к. думал над этими "гениальными" решениями
30 3311516
>>11466
Потому что try/catch это goto, скрытый, с неявным назначением, запутыванием стектрейса, обработкой ошибок в другой части кода.
Всё от минимализма, и всё понятно, если узнать, что Го делали во многом те же люди, что работали над С. Ну и в целом многие вопросы по гошке отваливаются сами собой, если есть знание чистого си.
31 3311556
>>11466

> Почему вместо while loop используется for ? Честно, очень путает


А че с этим не так, просто вместо while пишешь for и все
32 3311610
>>10782
Как замена https://google.github.io/styleguide/cppguide.html для всяких сетевых штук, которых надо писать посто дохуя, го заебись и решает задачи. А то, что там веб-макаки начали го засовывать во все дыры - это уже не проблема дезигна.
Т.е. вот это пишут на говне https://github.com/XTLS/Xray-core и им заебись
33 3311707
>>11610
Ну то есть го нужен для 1.5 сетевых утилит в гигакорпорациях уровня Гугла и Яндекса?
34 3311770
>>11610
Там уже подрачивают на раст (мне лень искать статью), походу го ждет судьба дарта.
35 3311858
А есть у вас какие то предпочтения по библиотекам которые вы используете в каждом проекте? Ну как некий стандарт, чтобы не переизобретать колесо? Может worker pool, errgroup, какие то ещё штуки? Может ent какой.

Пока я смотрю на го и ощущение что все кроме фреймворка (echo, gin) пишется с нуля используя stdlib. Да и фреймворки судя по реддиту тоже не любят.
36 3311950
>>11858

>все кроме фреймворка (echo, gin) пишется с нуля используя stdlib


Стандартной библиотеки за глаза.
Лучший язык как никак
37 3311975
В Гугле Go это замена Python для SRE. Для написания инфраструктуры - C++, приложений - Java/C++.
38 3312007
>>11858
Из того что сразу в голову приходит:
В го нет нормального стектрейса в стандартной либе . Мне нравиться emperror.
Нечто более специфичное но мне нравится- grpc-gateway вместо веб фреймворка. Генерит сразу реверс прокси, сваггер, ну и протобуфные штуки. Кайф короче
39 3312011
Чото не кликает у меня в голове голанг. Не понимаю, как писать, чтобы в итоге не получалось какое-то месиво. Из того, что прям вызывает максимальное отторжение:

- Утиные интерфейсы. По моему какая-то лютая нечитаемая хрень. Вместо того, чтобы просто глянуть сигнатуру класса и узнать, что именно он реализует (и, соответственно, куда его можно скормить), нужно каким-то блять магическим образом угадать, основываясь на прикрепленных к структуре функциях, какой же сука интерфейс она реализует (сам интерфейс ясен хуй валяется вообще в другом пакете, и это считается очень идиоматично и круто). Хуй поймешь в чем профит такого дизайн-решения.

- Отсутствие нормальных неймспейсов. В традиционных ООП языках все можно красиво рассовать по пакетикам и классикам, каждый из которых автоматически родит новый неймспейс для всего, что внутри. В го по факту пакеты это единственный способ родить неймспейс, ничего мельче нету. Сами пакеты внутри представляют собой какие-то солянки всякой всячины, наваленной в кучу по принципу "ну вроде из той же оперы". Ублюдочное решение с capitalized названиями функций/переменных для определения их визибилити.

- Работа со строками и массивами с каких-то хуев идет не через прицепленные к ним методы, а через strings и slices. Я хуй знает, может я чего-то не понял, но мне чето кажется, что говно в духе strlen, strncpy и прочее просто нахуй не должно существовать в новом языке, когда очевидно, что s.length и s.substring() выигрывают в читабельности и удобстве на порядки.

- Абсолютно надуманная нахуй не нужная еботня с pointer vs value.

- Работа с ошибками. По факту предлагается на выбор два сорта говна, которые можно еще и смешивать между собой - sentinel values и создание кучи абсолютно одинаковых структур под разные типы ошибок. Первый подход еще можно использовать без рвотных позывов благодаря errors.Is(), но при необходимости в таком случае достать дополнительный контекст ошибки начинается трахомудия. Второй подход более гибкий, если это слово сюда вообще применимо, но проверка типа ошибки через errors.As() это ебаный кал собаки, раздувающий сервисы/хэндлеры до космических размеров на ровном месте.

- Крайняя невыразительность языка. Даже тернарника нет, ебаный стыд. Вечная еботня с шэдоуингом ерроров, возвращаемых вторым значением в кортеже. Идиотская надуманная разница между = и :=.

Пока что понравилось по большому счету только принудительное форматирование кода из коробки к единому стилю, и каноничные табы вместо пробелов для отступов.
39 3312011
Чото не кликает у меня в голове голанг. Не понимаю, как писать, чтобы в итоге не получалось какое-то месиво. Из того, что прям вызывает максимальное отторжение:

- Утиные интерфейсы. По моему какая-то лютая нечитаемая хрень. Вместо того, чтобы просто глянуть сигнатуру класса и узнать, что именно он реализует (и, соответственно, куда его можно скормить), нужно каким-то блять магическим образом угадать, основываясь на прикрепленных к структуре функциях, какой же сука интерфейс она реализует (сам интерфейс ясен хуй валяется вообще в другом пакете, и это считается очень идиоматично и круто). Хуй поймешь в чем профит такого дизайн-решения.

- Отсутствие нормальных неймспейсов. В традиционных ООП языках все можно красиво рассовать по пакетикам и классикам, каждый из которых автоматически родит новый неймспейс для всего, что внутри. В го по факту пакеты это единственный способ родить неймспейс, ничего мельче нету. Сами пакеты внутри представляют собой какие-то солянки всякой всячины, наваленной в кучу по принципу "ну вроде из той же оперы". Ублюдочное решение с capitalized названиями функций/переменных для определения их визибилити.

- Работа со строками и массивами с каких-то хуев идет не через прицепленные к ним методы, а через strings и slices. Я хуй знает, может я чего-то не понял, но мне чето кажется, что говно в духе strlen, strncpy и прочее просто нахуй не должно существовать в новом языке, когда очевидно, что s.length и s.substring() выигрывают в читабельности и удобстве на порядки.

- Абсолютно надуманная нахуй не нужная еботня с pointer vs value.

- Работа с ошибками. По факту предлагается на выбор два сорта говна, которые можно еще и смешивать между собой - sentinel values и создание кучи абсолютно одинаковых структур под разные типы ошибок. Первый подход еще можно использовать без рвотных позывов благодаря errors.Is(), но при необходимости в таком случае достать дополнительный контекст ошибки начинается трахомудия. Второй подход более гибкий, если это слово сюда вообще применимо, но проверка типа ошибки через errors.As() это ебаный кал собаки, раздувающий сервисы/хэндлеры до космических размеров на ровном месте.

- Крайняя невыразительность языка. Даже тернарника нет, ебаный стыд. Вечная еботня с шэдоуингом ерроров, возвращаемых вторым значением в кортеже. Идиотская надуманная разница между = и :=.

Пока что понравилось по большому счету только принудительное форматирование кода из коробки к единому стилю, и каноничные табы вместо пробелов для отступов.
40 3312028
>>12011
Чувак, Го - низкоуровневый язык.
С великолепной поддержкой конкурентного программирования.
И интерфейсы - тоже одна из главных киллер-фич, ты просто не понял нихуя.

Но, да, язык очень сильно не для всех. И точно не для вката с улицы.
И с неймспейсами (с их отсутствием) они лоханулись капитально.
Вообще - язык очень сырой, выглядит как грязный хак, который делали для внутреннего употребления, а потом отпустили на волю. Типа Котлина, не к ночи будь он помянут.
41 3312037
>>12028

>Чувак


Уже достаточно.

>Го - низкоуровневый язык


Ну началось в колхозе утро. Что в нем низкоуровневого, расскажи? Тот факт, что надо явно таскать за собой указатели и/или каждый раз думать, нужно ли мне передать в функцию конкретно эту структуру или ее копию? В языке со сборщиком мусора эта ебола вообще нахуй не нужна. Ах да, сборщик мусора.Плюс решать, где ты будешь размещать структуру - на стеке или в куче - здесь тоже нельзя. В чем тут низкоуровневость?

>И интерфейсы - тоже одна из главных киллер-фич, ты просто не понял нихуя.


Возможно. Зато я вижу, что я никак не могу в компайл-тайм проверить, что моя структура реализует интерфейс. Вернее могу, но через жопу, специальным var _ MyInterface = (*MyStruct)(nil) заклинанием. Просто заебись.

>И точно не для вката с улицы


Мне и после 10 лет жабы, питона и жабаскрипта все вышеобозначенные вещи кажутся полной ебанутой хуйней.
42 3312054

>Мне и после 10 лет жабы, питона и жабаскрипта все вышеобозначенные вещи кажутся полной ебанутой хуйней.



Это другой язык, понимаешь?
Не лучше, не хуже, а другой.
И его надо учить, а не думать, что тебе и так всё должно быть понятно.

Это сложный язык, и очень сильно не для всех.
И тебе он, скорее всего, не нужен. Как и мне.
43 3312060
А может мне кто-нибудь пояснить про контексты в го? Я понимаю что они нужны для отмены горутин, но зачем создавать context.Background в функции main?

Вроде как это нужно для graceful shutdown, чтобы при sigterm отменить все задачи. Но бекграунд пустышка, она не умеет отменять. Почему бы просто тогда не создавать отдельные контексты на уровне хендлера сервера?

И это правда, что все функции что работают с сетью, бд и файлами всегда должны иметь контекст первым аргументом? Как вы делаете?
44 3312063
>>12011

> Утиные интерфейсы


> глянуть сигнатуру класса и узнать, что именно он реализует


Потому что класс может дохуя всего имплементировать и их явное указание сильно засрало бы код, а для понимания какие структуры какие интерфейсы реализуют есть IDE

> Работа со строками и массивами с каких-то хуев идет не через прицепленные к ним методы, а через strings и slices.


Вот на это кстати как будто насрать в проде, там не нужна вся эта изощренная ебля со строками/массивами

> Даже тернарника нет


А вот тернарников да, иногда не хватает

> Отсутствие нормальных неймспейсов


Бля, да, а вот это мем, я когда понял что чтобы написать +- норм либу, нужно все срать на верхнем уровне проекта, я немного охуел)

> Вечная еботня с шэдоуингом ерроров


А как это мешает? Мне это только пару раз помешало, пришлось первый аргумент до вызова функции в var объявить

Лично меня нередко калит херня с маппингом структур, а-дя DTO и external версия одной и той же структуры (которые отличаются наличием полей id и deleted в dto версии), но я хз как это в других ЯП делается

На истину не претендую, я мимо студентик-стажер
45 3312066
>>12060
Контекст крутая идея как по мне. Да, он везде должен пробрасываться. Помимо того что он может быть закэнселен, в него также можно складывать всякое. Это бывает удобно, у нас на проекте например взаимодействие некоторых gprc сервисов через это реализовано. Типа в некоторых интерсепторах грац в контекст складывается нужное валью (например какая нибудь метаинформация с фронта) и передается дальше
46 3312068
>>12060

> Но бекграунд пустышка, она не умеет отменять


Потому что для глобального graceful shutdown всех модулей/сервисов нужно создавать context.WithCancel(context.Background())
image.png6 Кб, 754x80
47 3312611
Скажите, почему хеллоу ворд на шарпе (AOT компиляции в бинарник) весит почти два раза меньше чем гошный хеллоу ворд?
И мне при этом не надо трахаться с err != nil
48 3312734
>>11770

>подрачивают на раст


Издалека, как и мы все, ибо он страшный как ассэмблер блядь.

Мне почему-то ГО всегда казался "более быстрым питоном" чтоб можно было быстро нахуярить программу, в чём я не прав? (не считая обилия библиотек)
49 3312738
>>12007

>emperror


> // Recover from panics and handle them as errors


>defer emperror.HandleRecover(handler)



Из каждого утюга же пиздят что не надо рековерить го ерроры и надо с каждой ошибкой вручную ебаться
if err != nil
, врут?
50 3312739
>>12611
Потому что рантайм у гошки массивный? Ты там GMP-машину в хелло ворлд тащишь, очевидно же. Потому же и либы на го не пишут для использования в не гошной кодовой базе.
51 3312742
>>12734
Нахуярить быстрее чем на питоне? Не. Попробуй посмотреть на него как на С, на который высыпали самосвал сахара.
52 3312790
>>12738
Без понятия, таким не пользуюсь и паниками тоже (только в редких случаях). Я говорил скорее про emperror.Wrap и emperror.WithStack
animatedf3zs1vy9ce5bdbccf52f68213351ca0b7920a521.gif84 Кб, 350x350
53 3312804
>>12011
Про интерфейсы и неймспейсы - ну, а с "классами" получается не лучше, по-моему.

>Ублюдочное решение с capitalized названиями функций/переменных для определения их визибилити.


Да вроде нормальное.

>Абсолютно надуманная нахуй не нужная еботня с pointer vs value.


Типа, "программист вообще не должен задумываться над подобным выбором"?)) Для таких существуют ЯваСкрипты и прочие Явы.

>Даже тернарника нет, ебаный стыд.


Да и ладно, он же затрудняет чтение.

>>12028

>Вообще - язык очень сырой, выглядит как грязный хак


Мне тоже начало так казаться со временем. Но, блин, а проекты на других языках, когда разрастаются, что ли выглядят лучше? Я очень сомневаюсь - это судьба всех языков...

>>12742
Ну, не "сахара", а важных достаточно вещей.
55 3313024
Под wasm кто писал? Какие подводные?
56 3314307
Сап дроч, решил основательно засесть за этот язык. Сейчас дошёл до net/http и нихуя не понимаю!

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 - маршрутизатор, но что он маршрутизирует, чем он управляет, если даже без него код работает также, как и с ним.
57 3314351
>>14307
// HandleFunc регистрирует handler в глобальный DefaultServeMux (net/http/server.go)
// http.ListenAndServe без второго аргумента слушает твой адрес и передает роутинг DefaultServeMux
// http.Request указатель на объект запроса; ResponseWritter интерфейс (поэтому без указателя, он и так им является) на объект для создания ответа

// Можно создать свой ServeMux и регистрировать в него handler'ы, а после передать в ListenAndServe
58 3314367
>>14307
Не хочу быть снобом, но ты меня вынуждаешь друг. Это все stdlib, у которой довольно неплохое описание в исходниках и документации. Погляди.
59 3314369
>>14351
Начнём с самого начала.

>HandleFunc регистрирует handler в глобальный DefaultServeMux (net/http/server.go)


Что значит "HandleFunc регистрирует handler"? Какой handler, что это. Если регистрирует, то откуда-то его берёт, но откуда. И что это.
Что значит "глобальный DefaultServeMux"? Что вообще такое ServeMux, какую функцию выполняет?

>http.ListenAndServe без второго аргумента слушает твой адрес и передает роутинг DefaultServeMux


Без второго аргумента оно не работает это раз; два - что значит роутинг; три - что такое DefaultServeMux. Зачем туда что-то передавать.

>http.Request указатель на объект запроса; ResponseWritter интерфейс (поэтому без указателя, он и так им является) на объект для создания ответа


"http.Request указатель на объект запроса" - что такое объект запроса, зачем он нужен.
Что значит "на объект для создания ответа". В смысле объект.

>Можно создать свой ServeMux и регистрировать в него handler'ы, а после передать в ListenAndServe


Спасибо за совет, но ничего не понятно.

Мне гораздо проще понимается всё на практике, можешь посоветовать где всё это можно было-б прочитать и протестить.
image.png141 Кб, 1500x1041
60 3314373
>>14367
Ну и что мне этот текст даёт? Что читать то, а? Меня интересует ответ на ворпос, что это за рандомные и не понятные функции >>14307, что каждая из них делает. Имею ввиду не под капотом, а просто понять на поверхностном уровне.
image.png133 Кб, 1711x687
61 3314379
>>14373

наслаждайся
62 3314383
>>14369

Че там не работает без второго аргумента у тебя? Все работает у всех
image.png30 Кб, 1049x178
63 3314389
64 3314392
>>14389

Ну nil ебни туда по кайфу
65 3314440
>>14369
Буквально все это можно спросить и чатгпт анон. Так ты не будешь тратить время многоуважаемых голанг наносников итт, а еще и объяснят лучше.
66 3314451
>>11346

>1.5 джуновских вакансий на хх


понял тебя
67 3314492
>>14373
Ты просто тупой. Не нужен тебе го.
68 3314564
>>12028

>Го - низкоуровневый язык


В каком месте?

>>12028

>язык очень сильно не для всех


А для чего и для кого он? Вон выше скидывали пример XTLS-Xray как сетевой утилиты, написанной на го. Но таких вещей делают 1.5 команды в мире.
В России го зачем-то используют для крудов, которые раньше писались на джаве, шарпе и питоне. И мне кажется для крудов это сильно плохой выбор, начиная самим всратым языком, заканчивая весьма убогим тулингом для написания классических бекендов с походами в базу данных. Да, можно все писать на голом net/http, и я так пробовал, но получается хуйня, объемы бойлерплейта раздуваются просто до космических масштабов.
69 3314567
>>12037

>Зато я вижу, что я никак не могу в компайл-тайм проверить, что моя структура реализует интерфейс. Вернее могу, но через жопу, специальным var _ MyInterface = (*MyStruct)(nil) заклинанием



Двачую, тоже раздражает эта хуйня.
70 3314590
>>14564

А что именно раздувается? Пример покажи пожалуйста
Я написал вот небольшой сервис, но напряга супер не заметил.
Конечно на шарпе половина бы само сгенерилось, но хз как-то
71 3314594
>>14590

>А что именно раздувается


Обработка ошибок.

Работа с ошибками. По факту предлагается на выбор два сорта говна, которые можно еще и смешивать между собой - sentinel values и создание кучи абсолютно одинаковых структур под разные типы ошибок. Первый подход еще можно использовать без рвотных позывов благодаря errors.Is(), но при необходимости в таком случае достать дополнительный контекст ошибки начинается трахомудия. Второй подход более гибкий, если это слово сюда вообще применимо, но проверка типа ошибки через errors.As() это ебаный кал собаки, раздувающий сервисы/хэндлеры до космических размеров на ровном месте.
72 3314619
>>12011

>- Утиные интерфейсы.


Это отдельный пиздец, особенно если структура гуляет через методы где тип пустой интерфейс отдельная тема, тогда узнаешь о том что не имплементирует в рантайме. Какой вообще долбоеб додумался до такой хуеты, чтобы он каждый раз узнавал что его туалет не имплементриовал туалетную бумагу каждый раз когда он посрет

>- Отсутствие нормальных неймспейсов.


Тоже пиздец, я бы сюда еще цикличные импорты добавил

>- Работа со строками и массивами с каких-то хуев идет не через прицепленные к ним методы, а через strings и slices. Я хуй знает, может я чего-то не понял, но мне чето кажется, что говно в духе strlen, strncpy и прочее просто нахуй не должно существовать в новом языке, когда очевидно, что s.length и s.substring() выигрывают в читабельности и удобстве на порядки.


Ты еще более интимно со слайсами не познакомился, при присвоении другой переменной там не всегда понятно ты со старым работаешь или создался новый. Это такой кривой дизайн

>- Абсолютно надуманная нахуй не нужная еботня с pointer vs value.


Это кстати наоборот полезная вещь когда знаешь что передал конкретно ссылку и конкретно значение, это позволяет избежать дополнительного выделения памяти, особенно когда гоняешь одну и ту же структуру по калопроводам бизнес логики

>- Работа с ошибками.


Это говно ебучее, с той же философией сделали в расте и оно удобнее когда вместо бойлерплейта наверх пробрасываешь при помощи ? но там проблема что разные типы друг в друга не впихуются и приходится брать anyhow или колхозить свой тип ошибок и писать From для каждого типа, которых собираешься впихнуть, тоже говнясто, но уже лучше чем в go.
Этот подход с ошибками с одной стороны хорошо ты начинаешь обрабатывать ошибки которые мог бы не учесть при исключениях и уже добавляешь нужное поведение. С другой стороны для обычного бекенда чтобы гонять json туда-сюда это крайне избыточно, такое хорошо наверное где требуется высокая паранойя и ответственность чтобы не одна ошибка не проскочила. В остальных случаях проще наверху ловить в try/catch ролбекать транзакцию и посылать нахуй клиента. В той нише куда залетел го я думал лучше было бы второе.

>- Крайняя невыразительность языка. Даже тернарника нет, ебаный стыд. Вечная еботня с шэдоуингом ерроров, возвращаемых вторым значением в кортеже. Идиотская надуманная разница между = и :=


Ну тут типа философия го, типа ты можешь что-то сделать только одним способом, плюс делали акцент на том что язык простой и понятный для всех, поэтому в нем много чего нет. Да и морж оператор хуйня согласен
72 3314619
>>12011

>- Утиные интерфейсы.


Это отдельный пиздец, особенно если структура гуляет через методы где тип пустой интерфейс отдельная тема, тогда узнаешь о том что не имплементирует в рантайме. Какой вообще долбоеб додумался до такой хуеты, чтобы он каждый раз узнавал что его туалет не имплементриовал туалетную бумагу каждый раз когда он посрет

>- Отсутствие нормальных неймспейсов.


Тоже пиздец, я бы сюда еще цикличные импорты добавил

>- Работа со строками и массивами с каких-то хуев идет не через прицепленные к ним методы, а через strings и slices. Я хуй знает, может я чего-то не понял, но мне чето кажется, что говно в духе strlen, strncpy и прочее просто нахуй не должно существовать в новом языке, когда очевидно, что s.length и s.substring() выигрывают в читабельности и удобстве на порядки.


Ты еще более интимно со слайсами не познакомился, при присвоении другой переменной там не всегда понятно ты со старым работаешь или создался новый. Это такой кривой дизайн

>- Абсолютно надуманная нахуй не нужная еботня с pointer vs value.


Это кстати наоборот полезная вещь когда знаешь что передал конкретно ссылку и конкретно значение, это позволяет избежать дополнительного выделения памяти, особенно когда гоняешь одну и ту же структуру по калопроводам бизнес логики

>- Работа с ошибками.


Это говно ебучее, с той же философией сделали в расте и оно удобнее когда вместо бойлерплейта наверх пробрасываешь при помощи ? но там проблема что разные типы друг в друга не впихуются и приходится брать anyhow или колхозить свой тип ошибок и писать From для каждого типа, которых собираешься впихнуть, тоже говнясто, но уже лучше чем в go.
Этот подход с ошибками с одной стороны хорошо ты начинаешь обрабатывать ошибки которые мог бы не учесть при исключениях и уже добавляешь нужное поведение. С другой стороны для обычного бекенда чтобы гонять json туда-сюда это крайне избыточно, такое хорошо наверное где требуется высокая паранойя и ответственность чтобы не одна ошибка не проскочила. В остальных случаях проще наверху ловить в try/catch ролбекать транзакцию и посылать нахуй клиента. В той нише куда залетел го я думал лучше было бы второе.

>- Крайняя невыразительность языка. Даже тернарника нет, ебаный стыд. Вечная еботня с шэдоуингом ерроров, возвращаемых вторым значением в кортеже. Идиотская надуманная разница между = и :=


Ну тут типа философия го, типа ты можешь что-то сделать только одним способом, плюс делали акцент на том что язык простой и понятный для всех, поэтому в нем много чего нет. Да и морж оператор хуйня согласен
73 3314622
>>12028

>Го - низкоуровневый язык.


Ну как сказать, чуть пониже жабы да, но в целом та же хуйня

>С великолепной поддержкой конкурентного программирования.


Даже в js с промисами удобнее работать чем с горутинами, тут столько косяков в дизайне

>И интерфейсы - тоже одна из главных киллер-фич


Действительно иногда в процессе выполнения бывает киллер-фича

>Но, да, язык очень сильно не для всех.


Проблема в том что его везде стали использовать

>Типа Котлина, не к ночи будь он помянут.


Они там упоролись по-другому. Основное это вендорлок, без их ide работа с языком затруднена и jvm это просто финиш, теперь туда пришли спринг и копроративное болото. Могли бы вместо всякой компиляции в js запилить kotlin native чтобы работать без жвм и сделать менее прибитым к ide и в целом к своей компании, тогда и взлетел бы повыше.
74 3314625
>>14564

>В России го зачем-то используют для крудов, которые раньше писались на джаве, шарпе и питоне.


Скорее всего попробовали дать жабистам пописать на нем, а синтаксис не дает размахнутся с AbstractSingletonProxyFactoryBean, вот и получилось написать за несколько дней то что раньше писалось несколько месяцев на жабе, кабанчикам понравилось и понеслась
75 3314661
>>14619

> Это отдельный пиздец, особенно если структура гуляет через методы где тип пустой интерфейс отдельная тема, тогда узнаешь о том что не имплементирует в рантайме. Какой вообще долбоеб додумался до такой хуеты, чтобы он каждый раз узнавал что его туалет не имплементриовал туалетную бумагу каждый раз когда он посрет



Можно какой то более конкретный пример когда это проблема? Я искренне не понимаю ситуации где функция должна принимать пустой интерфейс а не конкретный. Звучит как хуевый дизайн самого метода/сервиса
76 3314758
>>14661

>Звучит как хуевый дизайн самого метода/сервиса


Звучит как примерно 90% кодовой базы. Я часто вижу, что интерфейсов либо нет, и всё захардкожено, либо везде var 🤡 interface{}
77 3314887
>>14661
Проблема в том что ты не всегда живешь в идеальном мире и код не всегда написан тобой и иногда приходится видеть такое. Ну и плюс сторонние либы чуть менее чем полностью состоят из пустых интерейсов.
То что с нуля пишется разумеется уже имеет лучшую архитектуру и адекватный код
78 3315021
>>14758

>interface{}


В чём он не прав? Вместо ебли с определениями
79 3315041
>>15021
А зачем тогда нужен язык со статической типизацией? Проще питон взять.
interface{} это все равно что указатель на void в Си использовать. Или Object из джавы.
80 3315250
>>15041

>А зачем тогда нужен язык со статической типизацией?



Говорят тогда будет работать на 0.1234 ns быстрее всё если типы прямо указывать, не зря ебёмся же
81 3315294
Привет, а что по фреймворкам в Го? Какой брать для веба?
animatedf3zs1vy9ce5bdbccf52f68213351ca0b7920a521.gif84 Кб, 350x350
82 3315542
>>15294
Фреймы для быдла.
83 3315555
Goвно
84 3315569
>>14622

>Они там упоролись по-другому. Основное это вендорлок, без их ide работа с языком затруднена и jvm это просто финиш, теперь туда пришли спринг и копроративное болото. Могли бы вместо всякой компиляции в js запилить kotlin native чтобы работать без жвм и сделать менее прибитым к ide и в целом к своей компании, тогда и взлетел бы повыше.


Котлин теперь основной язык разработки под андроид. Это огромный кусок рынка. И начинался он именно как better Java, чтобы реализовать синтаксисический сахар, но так чтобы всё работало на Dalvik. В бекенд он пришёл сильно позже и это уже была попытка ЖБ как-то ещё пристроить язык и продавать свои IDE. И в целом, там где пишут а не переписывают с Jaca бэк на Котлине Спринг не используют.
85 3315670
А как вы структурируете свои сервера и веб сервисы? Что посмотреть-почитать?
86 3316165
>>14492
Но создатель языка сказал что го для тупых?
87 3316170
>>14622

>прибитым к ide и в целом к своей компании,


Жаба прибита все к той же IDE, но никто об этом не кричит.
выбрал шарпы для своих проектов, только потому что нормальная поддержка в трех крупных редакторах
88 3316173
>>14625
Звездеж, жабист/шарпист со спрингом/asp.net за минуту разворачивает то, что на го еще даже не написано еще.

Го пытались продать как язык для тупых, мол кабан получить тру-кодеров по цене суслика. Но деды родом из 70х не писавшие реального кода 50 лет не знали, что главная сложность в современной разработке это не синтаксис.
89 3316174
>>15294
На го не пишут реальный веб, там микро-писька кидающиеся json'нами, что-то больше на нем писать на можно, но больно, поэтому до сих пор нет норм веб комбайна. естественно будут кричать ненужно, все чего нет всегда кричат ненужно, как и дебаггер не нужен был, как и дженерики, как и обработка ошибок итд
90 3316178
>>15569
Котлин лишь обосрался с тем, что на jvm больше (практически) не начинают бэкенд проекты.
91 3316225
>>16178

>на jvm больше (практически) не начинают бэкенд проекты


Этим мантрам уже лет 10.

>2 978 вакансий «Java»


>1 157 вакансий «C#»


>1 696 вакансий «Go»

92 3316311
>>14758
>>14887
Не ну это объективно пиздец. Я придумал случай, когда метод реально должен принимать any. Это работа со всякими маршелерами/анмаршелерами. Но пихать везде эни когда можно нормально описать интерфейс это просто треш
93 3316613
>>16225
У тебя бот сломался, неправильный триггер.
94 3316642
>>16613
По сути есть что?
95 3317107
>>16225

>1 696 вакансий «Go»


На некоторых сайтах у го багованный поиск из-за простого базворда. Да, в топе более релевантное но дальше идет мусор. В моей мухосране вообще выдает яндекс сервисы (видно где-то есть базворд го)
Помню как был рост на тиобе, когда появилась игра go.
96 3317108
>>16642
Да, бот сломался, триггер сработал на котлин вместо го.
17216367925000.jpg144 Кб, 640x430
97 3317782
Потихоньку вкатываюсь
Еще немного и будет открыта дорога в энтерпрайз

бабло в пути
Нужно только потерпеть...
98 3317813
>>17782
Останется только где-то взять 5 лет работы. додик повелся на развод инфоцыган
99 3318296
>>17813
Нарисует. У меня 6 лет в резюме было нарисовано.
100 3318336
>>17782

>Потихоньку вкатываюсь


Вкат закрыт.
animatedf3zs1vy9ce5bdbccf52f68213351ca0b7920a521.gif84 Кб, 350x350
101 3318391
>>17782
Конечно, шансы есть. Успехов!
102 3318505
>>16173

>Звездеж, жабист/шарпист со спрингом/asp.net за минуту разворачивает то, что на го еще даже не написано еще.


А потом жабист идет смотреть 3 часа конференцию в которой три долбоеба и крупных банков в синих рубашках с бейджиками обсуждают как нужно правильно написать конфиг для очередной ОРМ чтобы не было N+1 и чтобы вся БД не выгружалась в память.

> главная сложность в современной разработке это не синтаксис.


Это верно подмечено, жабисты и без синтаксиса нахуевертят сложностей
103 3318510
>>12611
Наверное в него статически компилится дохуя сишных либ. Это нетрудно проверить.
104 3318551
>>18505

>А потом жабист идет


Жабист идет нахер, а вот у шарпистов есть серия стандартов в ОРМ, а не зоопарк васянских либ, и понимаешь в чем фишка, ты либо можешь это использовать либо нет. Это выбор, а в го, извини, выбора нет. И все равно какой-то
мудень забудет сделать проверку err = rows.Err()
105 3318556
>>18510
Там в шарпах тоже статик бинарь.
В голанге шедулер корутин, в шарпах stackless стейт машина, он даже не знает про корутины.
106 3318646
>>14369
Мб уже объяснили, или сам отрыл, но мой совет такой: возьми и почитай исходный код стдлибы. Вот сядь и прочитай. Построй связи между компонентами, посмотри что и как вызывает и в какой последовательности. Мне в свое время понять стандартный http помогло именно это.
107 3318652
>>14369
В добавок к предыдущему докину, что без личного прощупывания хуй поймешь отличия всех Handle, Handler, HandleFunc, HandlerFunc и т.д. Ну и гуглить не забывай, тоже важный момент, инфы навалом
108 3318677
>>16174

> как и дженерики


Отдельный мем. Их где-нибудь по итогу использовали адекватно? Я вроде в стандартной либе где-то видел один раз и все.
17310958002630.mp41,3 Мб, mp4,
640x360, 0:04
109 3319227
110 3319306
>>19227
Они оказывается еще до кассы в пятерочке такими злыми становятся
111 3320063
У кого какие пет-проекты? Го обсудим
112 3320588
>>20063
Го можно терпеть в бигтехе за бабло, но делать пет проекты, мы че копрофилы?
113 3320594
>>20063
Телеграм бота писал. Бот на ключевое слово, постил в чат картинку.
image.png9 Кб, 321x241
114 3320711
>>20063
Вот это планирую
никогда проекты не делал. Ток задачи решал на кодварсе или литкоде
115 3320741
>>20711
А где эти проекты можно найти?
В частности что у тебя на скрине
116 3320748
>>20063
А что на гоу кроме круда и cli утилиты сделать можно?
Чет задизморалился на этой теме.
Что-то интересное превращается в обертку системных либ
117 3320771
Кто-нибудь использует какие-нибудь обертки над горутинами, чтобы без ебли быстро писать worker pool'ы и всякие там таск раннеры типа как errgroup?

Поймал себя на мысли, что не понимаю как из errgroup получать результаты функции. Если жаваскриптеры есть, то мне нужен аналог Promise.all и Promise.allsettled.

Думаю может начать писать какую-то обертку даже свою с каналами.
image.png93 Кб, 1010x742
118 3320782
119 3320872
>>20748
Системные языки это языки с прямым менеджментом памяти.
Если бы не положили бы болт на арены, то с натягом можно было отнести к низкоуровневому (как спаны в си-шарпе) но никак не к системным. Вроде в го даже ансейва нет.

Языки с низкоуровневыми возможностями
C#, Свифт, Котлин.нейтив
Системные языки
C/C++, Rust, Zip (и прочая экзотика)
120 3320922
>>20872

>Вроде в го даже ансейва нет.


Есть конечно, и ручная аллокация/деаллокация там. И подключение библиотек на С с вызовом функций из них.
121 3320986
>>20872
https://github.com/0xcafed00d/joystick

Вот держи байтоебство. На го этим заниматься можно.
Можно даже на уровень IP спустится (ниже TCP и HTTP) и от туда ручками пакеты заворачивать.

Другое дело, что занимаются таким тут реже, и я чаще вижу c-биндинги, проброшенные в го, чем чистое го-байтоебство.
122 3321085
>>20986
Наверное байтоебство неправильный мем, с байтами ты буквально ебешься когда сырую utf-8 строку гоняешь или 8-бит буферы. Тут скорее ебство с сырыми указателями.
123 3321089
>>20922
>>20986
Это же вроде отдельная тулзовина cgo а не чистый go?
124 3321461
>>21089
Ручное управление есть и просто в ансейфе. Дёргание функций из сишных либ либо да, через пакет CGo, либо с компилятором GNU, там вообще напрямую и гошные функции можно из си дёргать.
125 3321475
>>21089
В примере выше дергание чистых си-функций только в файле для osx (darwin). Линукс не использует си, если посмотришь исходники.
Даа, ебать его рот блять сука, втянули нахуй в какую-то хуйню. Коломойский..mp41,3 Мб, mp4,
1280x720, 0:09
126 3321921
>>08295 (OP)
Блять, у меня горит нахуй от того что не могу понять как устроен тип string.

Вот есть переменная типа string:
1. под капотом она имеет указатель на массив byte

2. в свою очередь byte это просто обертка над типом uint8

3. но из-за того что строка сама по себе не массив символов а массив байтов, собственно любая попытка получить доступ к конкретному символу обернется фейлом так как ты получишь только числовое представление символа из кодировки UTF-8

4. Чтобы это исправить ты должен преобразовывать полученный конкретный байт из строки в тип string().

Собственно вопрос.
НАХУЯ НУЖЕН ТИП rune?????!!!
Ну вот нахуяяяя!?!?!?!??!??!?
БЛЯТЬ как же меня корежит и трясет....
127 3321925
>>21921

>НАХУЯ НУЖЕН ТИП rune?????!!!


Чтобы преобразовывать строку в слайс рун и работать спокойно с символами, не ебя себе мозг.
128 3321928
>>21925
А нельзя, потому что одна графема может состоять из нескольких кодпоинтов, лемао.
image.png40 Кб, 708x436
129 3321949
>>21925
>>21928
Так бля, я накинул такой пример, я правильно понимаю что, из-за того что в byte aka uint8 aka 1 байт помещается только цифры от 0-9, латиница A-z a-z и горстка ебаных символов, любая попытка использовать иное аля кириллица, иероглифы приводит к фейлу так как в ASCII/UTF-8 они просто не прописаны, и эту проблему решает rune aka uint32 aka 4 байта который по сути имплементирует UTF-32 благодаря которому можно работать с любыми символами мира.
130 3321955
>>21949

>можно работать с любыми символами мира.


Не совсем. Есть символы-модификаторы для д̷͊͛̌͜и̵̺̟̊а̵̝̫͍͙̊к̷̡̛̜͒̈͘͘р̵̛͍̬̍̈́и̷̺̚т̶̡͂̈̔и̵̥̉̽̂к̶̤̤͕̫̎̾͒̓ͅи̷̜̐̚, есть составные эмодзи (мужчина + черный + беременность). То есть на глаз определить, сколько байт в строке вообще не всегда возможно.
131 3321959
>>21949
В UTF-8 есть всё. Но это тип переменного размера, поэтому руна берёт максимальные 4 байта и всё.
132 3321972
>>21955
>>21959
Нихуя не понял....

>Но это тип переменного размера


UTF-8 он может быть от 1 до 4 байт, хорошо

>Есть символы-модификаторы для д̷͊͛̌͜и̵̺̟̊а̵̝̫͍͙̊к̷̡̛̜͒̈͘͘р̵̛͍̬̍̈́и̷̺̚т̶̡͂̈̔и̵̥̉̽̂к̶̤̤͕̫̎̾͒̓ͅи̷̜̐̚, есть составные эмодзи (мужчина + черный + беременность).


Есть такие символы для которых нужно несколько рун?
133 3321975
>>21972

>Есть такие символы для которых нужно несколько рун?


Да. Поэтому на практике UTF-32 просто ни для чего не нужен.
134 3322408
>>21972

>Есть такие символы для которых нужно несколько рун?


Знаменитый флаг Уэльса 🏴
135 3322412
>>21928

>А нельзя, потому что одна графема может состоять из нескольких кодпоинтов, лемао


В ASCII такой хуйни не было!
136 3322484
На го нет вакансий в валлед ворлде. Без шуток. В странах первого мира (нидерланды, uk, швейцария, австрия) не используется нигде голанк. В США тоже не так много вакансий на го. С чем это связано? Почему го взлетел именно в РФ и нигде более?
137 3322541
>>22484
Потому что в РФ живой рынок, много проектов с нуля пишется, а го это отличный язык как новый выбор. В странах загнивающего мира поддерживают тухлое легаси. Посмотри сколько там вакансий на ебучем Коболе и охуей.
138 3322563
>>22484

>Почему го взлетел


А хулиб ему не взлететь? Хороший язык же
139 3322571
>>22484

>С чем это связано? Почему го взлетел именно в РФ и нигде более?


из за использовании в госухе
140 3322577
>>22484
Уровень сеньоров и тимлидов ниже.
Ну, то есть, реально есть "молодые и успешные" тимлиды считающие, что го это "улучшенный си".
141 3322622
>>22484
Потому что го лучше всего подходит, чтобы писать разные парсеры/брутфорсы/чекеры/регеры/бомберы/подобный около-хак софт и бекенд к телеграм ботам, а у нас это все любят как нигде.
142 3322660
>>22622

>парсеры



Что-то хоть не хуже питухонского Beatiful Soup есть на Го для парса хтмла и поиску по css селекторам в нём?
143 3322675
>>22660
https://github.com/PuerkitoBio/goquery есть вполне неплохой аналог.

Другое дело что если тебе нужен фреймворк уровня скрейпи, то конечно лучше петухон. Хотя на го и был какой-то более тухлый аналог.

В остальном да, скрепер на петухоне напишется раза в 1.5-2 быстрее чем на го, там попроще и библиотеки приятнее.
144 3323192
>>22660
>>22675
Какие вообще причины писать скрепер не на питухоне? Даже если ты отбитый фанат говна.
animatedf3zs1vy9ce5bdbccf52f68213351ca0b7920a521.gif84 Кб, 350x350
145 3323311
>>22484
А как ты так узнал? Кажется, в "валлед вордле" вообще нет единой вменяемой доски объявлений для вакансий.
146 3323354
>>23192
Все пишется приятнее на петухоне. Мне интересно, только у нас ставят выше комфорт разработки с желанием сэкономит кабану на железке? Или заграницей так же?
147 3323392
Кто-нибудь с других языков в Го перекатывался? Посоветуйте книги для перекатывающихся.
Читать 500 страниц про "переменная это коробочка, куда мы кладем данные" как-то не хочется.
148 3323569
>>23392
В чем смысл? Язык за выходные учится
149 3323575
>>23392

>Кто-нибудь с других языков в Го перекатывался?


Главный вопрос - зачем это добровольно делать?
150 3323576
>>23575
В среднем на российском рынке на Го больше зп и пишутся новые проекты. На джаве и питухоне ситуация хуже - много чего находится в состоянии вечной поддержки легаси и зепки ниже.
151 3323845
>>23392
Документация на оф сайте, плюс чатгпт для тупых вопросов. В го самое сложное это горутины и ее паттерны. Если катишься с js, то придется ещё про синхронизацию изучать, всякие мьютексы и семафоры.
152 3323848
>>23192
Причина та же как и везде с го. Используя го можно затыкать боттлнеки чуть более производительным софтом. Одно дело написать за вечер скрепер Амазона и забыть, собрав данные на сегодня.

Другое дело писать сложную систему с кучей скреперов разных сайтов, масштабировать в кубернетисах, экономить деньги кабану и прочее. В какой то момент 100 мб в ОЗУ на питон может стать затратнее чем 10 мб на говне.

Но я согласен что это не всем надо.
153 3323985
>>23576
ЗП больше потому что нужны сеньки, которые разгребут бойлерплейт предыдущих модных и молодежных
154 3324035
>>23985
Тыскозал?
155 3324060
>>24035
Яработал. Гоферы через бойлерплейт и самописульки умудрились сделать легаси код еще хуже чем на жабе, казалось бы куда хуже.
animatedf3zs1vy9ce5bdbccf52f68213351ca0b7920a521.gif84 Кб, 350x350
156 3326413
>>24060
Просто не повезло.
lang-demand.PNG66 Кб, 864x915
157 3326432
158 3326861
>>26413

>Просто не повезло


вкатится в го.
o7n2H7v5qpw.jpg122 Кб, 1774x1265
159 3329361
Помогите тупому понять указатели в го, когда нахуй писать эти * и &, а когда нет?

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

Почитай про указатели в си, тут тоже самое, но без арифметики.
animatedf3zs1vy9ce5bdbccf52f68213351ca0b7920a521.gif84 Кб, 350x350
164 3329742
>>29361
https://go.dev/play/p/rekATAlU1Ow
Допустим у тебя есть переменная типа "структура с некими полями". Ты хочешь отправить эту переменную в функцию так, чтобы функция изменила значения её полей. Соответственно, если функция принимает переменную не по указателю, то в туда скопируется значение самой переменной - в данном случае структура, т.е. по сути, просто создастся новая такая же структура. Когда выполнение функции закончится, ты обнаружишь, что поля переменной, которую ты передавал в качестве аргумента в функцию, остались прежними. А тебе нужно, чтобы функция меняла значения полей исходной переменной, поэтому тебе придётся отправить её по указателю - всё просто.

Ну и плюс, есть более сложные кейсы с использованием указателей. К примеру, рекурсивные структуры данных - типа списков, деревьев и всякого такого.
165 3329979
>>12011

> - Работа с ошибками. По факту предлагается на выбор два сорта говна, которые можно еще и смешивать между собой - sentinel values и создание кучи абсолютно одинаковых структур под разные типы ошибок. Первый подход еще можно использовать без рвотных позывов благодаря errors.Is(), но при необходимости в таком случае достать дополнительный контекст ошибки начинается трахомудия. Второй подход более гибкий, если это слово сюда вообще применимо, но проверка типа ошибки через errors.As() это ебаный кал собаки, раздувающий сервисы/хэндлеры до космических размеров на ровном месте.


Ошибки не предназначены для того, чтобы их анализировать. error нужно пробросить и в итоге выплюнуть в лог. Это как исключение, только программа не вылетает.
Если тебе нужно обрабатывать ситуации, то возвращай статус коды.

>В традиционных ООП языках


Го не ООП язык.
166 3329991
>>29979

>Ошибки не предназначены для того, чтобы их анализировать.


И как мне понять что вернуть юзеру, 40Х или 50Х? На самом нижнем уровне в каком нибудь парсере решать, что это за тип ошибки и возвращать 401?
167 3330010
>>29532
>>29533
>>29742
Спасибо.

>https://go.dev/play/p/rekATAlU1Ow


Отлично помог этот пример, и каким же простым он оказался, теперь я чувствую себя ещё более тупым, чем я думал. Завидую людям, которых обучали сразу с низкоуровневых языков программирования. Потому что мне теперь ещё предстоит увлекательное погружение в горутины, каналы и вот это всё.
animatedf3zs1vy9ce5bdbccf52f68213351ca0b7920a521.gif84 Кб, 350x350
168 3330088
>>30010
Не парься, в любом случае твой опыт вряд ли усугубит понимание. Меня хоть и обучали в универе на низкоуровневых ЯП, но до этого я самообучался вообще хрен знает с чего - со всяких ActionScript'ов в частности.
Обновить тред
Двач.hk не отвечает.
Вы видите копию треда, сохраненную 27 ноября в 11:08.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски