Это копия, сохраненная 31 августа 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Дженериков нет, эксепшенов нет, просто смирись.
Обработка ошибок получается охуенно через http://github.com/pkg/errors | в приложениях обычно можно просто паниковать на ошибках.
HTTP-сервер для убер максимального маня-хайлоада: https://github.com/valyala/fasthttp
С версии Go 1.11 наконец-то появится официальный менеджер зависимостей vgo
Для вката в Go читай Донован, Керниган "Язык программирования Go", https://www.golang-book.com/, книги из списка https://github.com/dariubs/GoBooks, а также смотрим видео https://www.youtube.com/channel/UC_BzFbxG2za3bp5NRRRXJSw
Вкатываемся в эпоху докера, микросервисов и адово кошерной сетевухи.
Предыдущий: >>1314918 (OP)
нумерация утеряна, так что перезапуск нумерации
ржу с пика
Говорят что в Языке программирования го очень много воды
<?xml version="1.0" encoding="UTF-8" ?>
<azaza>
<ololo>puk</ololo>
<ololo>kek/jpeg</ololo>
<azaza>
type Xuy struct {
Ololo []string `xml:"azaza>ololo"`
}
Делаю анмаршал, а структура пуста. Какого хрена?
Для начала лучше разберись как устроенна асинзронность вообще. Погугли событийные циклы. Очереди задач. Асинхронность на генираторах и каллбеках.
Все асинхронные механизмы во всех языках работают на них.
Мимо Питон макака.
Во-первых, закрой тег /azaza, траллер. Во-вторых, почитай про xml tags, в данном случае тебе поможет xml:"ololo"
Что именно тебе не понятно?
Отдельный поток исполнения, смотрит в общую память, но общаться лучше через каналы. Магии как раз минимум (гарантий впрочем тоже)
В очередной раз я пришел сюда за интересными идеями для полезных консольных утилит. Вся надежда на тебя, анон!
что смогу сделать на этом говне? бота для телеги можно?
Хорош
Чтоб писать относительно небольшие программы и микросервисы на компилируемом языке, а не поддерживать монструозные проекты на джаве/дотнете
Как бы тебе сказать...
Предлагаешь анончику пользоваться консольным gdb?
Я сам не фанат vscode, но на данный момент это лучшая ide для гошечки.
Зачем вам отладчик/ide для языка, в котором тестов пишут больше чем кода, и скомпилировать с неиспользуемой переменной не дают. Зачем?
> Зачем вам ide
Например для быстрой навигации по проекту и удобного рефакторинга. Моя влажная мечта запомнить cli команды по типу gofmt и gorename и перекатиться на какой-нибудь vim.
> Зачем вам отладчик
Иногда нужно посмотреть что у тебя приходит в параметрах запроса или результат вызова json.Unmarshal. Банально у тебя большая структура, которая не помещается в консоль когда вызываешь fmt.Println. В добавок иногда не всё удаётся покрыть тестами.
>>362737
Извини. Я думал это как вызов `порекомендоватьVScode()` и он закомментирован.
vim-go такие вещи по \f умеет. Не надо ничего запоминать.
>Иногда нужно посмотреть что у тебя приходит в параметрах запроса или результат вызова json.Unmarshal.
В нормальных языках для этого отладчики не нужны. Как всегда, ide лишь компенсирует ущербность языка.
1) В Го нет только наследования, которое не самая популярная опция в ооп. А так, по сути, там есть те же классы и интерфейсы.
2) Так ли надо ооп для успешного программирования?
>>363041
>В нормальных языках для этого отладчики не нужны.
Ну назови "нормальный" язык, который используется массово для промышленной разработки и без иде.
>Ну назови "нормальный" язык, который используется массово для промышленной разработки и без иде.
Во-первых, я ничего не говорил о "языке, который используется без иде". Перечитай еще раз.
Во-вторых, называю: си, баш, пайтон, руби, луа, жс, го.
Нет, я не перетолстил, луой действительно часто пользуются без ide.
Почему в го-треде одни дебилы?
Да понятно, что без IDE, вопрос в том что Lua это с очень большой натяжкой промышленный язык
Без отладки (как процесса) ты нормальный промышленный код написать не сможешь практически никогда. И тут у тебя два варианта: иде с дебаггером или log.println() как деды завещали.
Серьезно? В питоне есть интерактивный дебагер останавливающий выполнение программы и подключающий, собственно, cli дебагера, звучит как что-то, что присуще каждому нормальному языку
Нихуя себе, LuaJit так то быстрее вашего v8, все нормальные люди уже давно если не используют, то пробуют lua
Ты определись с тезисом, который ты доказываешь.
То ты говоришь, что отладчики не нужны, то теперь говоришь, что в питоне он нужен.
Ну на луе скорее всего кода написано больше, чем на сабже, например. Я не знаю, что за критерии "промышленного языка" у тебя. Скала промышленная? А кложа? А котлин? Ну ладно, а Ада промышленная? Вот хаскель несколько банков для внутреннего софта используют - это делает его промышленным или он остается академическим? Ну и так далее.
я не утверждал что отладчики не нужны, только одноизвилиннаяпринтоблядь такое говорить станет, меня удивили предложенные варианты, то есть либо а-ды-йе либо принты, и мой кейс был в том что во всех нормальных языках должен быть как минимум дебагер с cli
>И тут у тебя два варианта: иде с дебаггером или log.println()
Сразу две ошибки. Во-первых, дебаггер может быть без иде а иде, наверное, может быть без дебагера. Во-вторых, варианты этими двумя не исчерпываются.
А какие еще варианты для отладки, кроме этих?
>дебаггер может быть без иде
Он и есть без иде, называется delve
> мой кейс был в том что во всех нормальных языках должен быть как минимум дебагер с cli
Если говорить нормальными утверждениями, то я утверждаю что дебагеры - это удобный инструмент для дебага кода (удивительно), который удобнее принтов по очевидным причинам, и утверждать что они не нужны - все равно что утверждать что тебе не придется дебажить тылу е код, что либо ложь, либо подразумевает что твой код организован каким-то специальным образом который полностью логирует весь алгоритм приложения вплоть до стека вызовов или близкого к тому
тем самым заменяя необходимость дебага возможностью просто смотреть логи
фикс: тылу е -> твой
>А какие еще варианты для отладки, кроме этих?
Репл, например.
>Он и есть без иде
Так я отвечал на ">И тут у тебя два варианта: иде с дебаггером или log.println()"
>>363655
> твой код организован каким-то специальным образом который полностью логирует весь алгоритм приложения вплоть до стека вызовов или близкого к тому
Для этого не нужно какой-то специальной организации кода, во всех нормальных языках можно включить трейсинг исполнения. Хотя разумеется написание маленьких чистых функций вместо больших и грязных здорово помогает не сломать потом голову при попытке распарсить лог трейсинга.
Так вот за что просят 250К гривен, кек.
Купил себе в офис "геймерскую" клавиатуру для подобных хуёвин, записал на макросы на доп кнопки. Сначала надо мной ржали, теперь почти весь отдел купили себе похожие.
Бамп
Это тот, из чьего спидозного очка ты высосал свой ним.
Зачем в принципе учить языки, на которых пишут полторы калеки? По приколу или для пет-проекта можно, но работу себе на нем не найдешь.
постмодернизм, самоирония))
БАмп
>работу себе на нем не найдешь
Ха-ха, ту что, все учат погромирование в надежде найти работу? ХХАХАХАХА
Бамп
Что там по работе на Го? Хочу выкатится/совместить с пистоном. Интересует перспектива зарплаты/трактора
Имеется бекграунд в виде двух лет бека на пистоне
Антоны, а есть какие-нибудь ещё интерактивные челленжи по типу codewars с Go?
Оригинальный вопрос: >> 1362537
> Отладка в голанде уебанская какая-то.
Лол. Я тоже не сразу понял, что речь идёт не про язык, а про ide.
Полгода назад сравнивали отладку в голанде и вс коде, в голанде была поудобнее. Что именно вызвало неудобства?
Аноны скажите что учить в связке с го
Перекатываюсь в него из ноде жс
И что то кажется одного только го для проекта не хватит
Получается только микрлсервисы на нем пилить ?
Или ещё пыху подучить
Пистон учи, будешь с него сервисы переписывать
Го обычно работает один на проекте, то есть фулстэк разрабы с го не особо популярны. Учи го, базы данных, архитектуру, можешь еще захватить кубернетес
>Учи го, базы данных, архитектуру, можешь еще захватить кубернетес
Я бы сказал учи кубернетес, можешь еще го захватить.
на шару вкатился на го(отписывался в прошлом) кун
Почитал про разные ЯП и возник вопрос, стоит ли начинать глубокое изучение языка с Го или лучше иметь базу с того же С или Питона?
Двачую вопрос
Они вообще есть?
Если есть, заканчиваются ли на банальном? Map,stack...?
Или у вас пошире и найдутся посложнее? hash table, segment tree...?
Анон, чому я не могу сконвертить в интегер результат, возвращаемый os.Getenv? Как вообще числа хранить в енв файлах?
Тащемта ничего сложного-то ту нет. Просто храни в строке и конвертируй.
value := strconv.Atoi(os.Getenv("SOME_VALUE"))
Спасибо, анончик
map,array, slice
я понемногу включаю го в свой рацион, и при работе над пет прожектом столкнулся с проблемой.
Мне необходимо в обработчик запроса захуярить еще один параметр, помимо реквеста и респонса.
В тырнете советуют делать такую инъекцию зависимости, (я еще не пробовал так делать)
но я уже не совсем догоняю как она сработает, ведь мы пассим только функцию в качестве аргумента, откуда там остальные поля структуры ?!
type Users struct {
db gorm.DB
}
func (users Users) showHandler(w http.ResponseWriter, r http.Request) {
//now you can use users.db
}
func (users Users) addHandler(w http.ResponseWriter, r *http.Request) {
//now you can use users.db
}
// setup
users := &Users{db: createDB()}
router.HandleFunc("/users/{id}", users.showHandler).Methods("GET")
router.HandleFunc("/users/new", users.addHandler)
//etc
Дублирую код картинкой, это все решение со стака
Спасибо за ответы
я понемногу включаю го в свой рацион, и при работе над пет прожектом столкнулся с проблемой.
Мне необходимо в обработчик запроса захуярить еще один параметр, помимо реквеста и респонса.
В тырнете советуют делать такую инъекцию зависимости, (я еще не пробовал так делать)
но я уже не совсем догоняю как она сработает, ведь мы пассим только функцию в качестве аргумента, откуда там остальные поля структуры ?!
type Users struct {
db gorm.DB
}
func (users Users) showHandler(w http.ResponseWriter, r http.Request) {
//now you can use users.db
}
func (users Users) addHandler(w http.ResponseWriter, r *http.Request) {
//now you can use users.db
}
// setup
users := &Users{db: createDB()}
router.HandleFunc("/users/{id}", users.showHandler).Methods("GET")
router.HandleFunc("/users/new", users.addHandler)
//etc
Дублирую код картинкой, это все решение со стака
Спасибо за ответы
Смотри сигнатуру HandleFunc. Про коллбэки слышал? Подучи программирование в принципе.
при чем тут коллбеки, просто HandleFunc принимает метод с конкретными параметрами
Ох, ну добро пожаловать в Го. Тут многие вещи происходят магическим блядь образом во время рантайма. showHandler, showHandler это не методы, а функции, рантайм сам подставит, первым аргументом (users Users) а уже потом те, что соответствуют типу колбека.
Короче говоря, несмотря на то, что у тебя как бы мето func (user Users) addHandler(...) На самом-то деле у тебя вот такое func ( user Users, w http....)
Чтобы отсеять слабых духом. Вот какого ты ответа, блядь, ожидаешь на такой охуительный вопрос?
Я надеялся на какой-то скрытый смыл ну что ж будем терпеть и кушать кактус.
Кстати поясните за channel, если я допустим хочу написать парсер и выгрузку webm с двача.
мне нужен
1. скедулер - который раз в какой-то момент будет кидать ивент(или хуй знает как оно у вас называется)
2. парсер json - который сделает http запрос и тред и закинет в кьюху webm которые нужно выкачать
3. downloader -(канкаренси будет тут) который выкачивает все и сохраняет на диск
Может кто рассказать в двух словах как это православно на гошечке заимплементить?
>почему такая уебанская X?
>golang
Ох, тебя ждет еще много удивительных открытий, мой юный падаван.
С каналами все просто.
У тебя есть канал с определенным буфером ( по умолчанию буфер равен 1). В канал кладешь инфу, в другой горутине читаешь. Если горутина не может положить ( весь буфер заполнен) или не может прочитать( в канале пусто), то она блокируется до момента, когда ситуация разрешится.
По дефолту значения nullable во многих субд, тебе нужен пойнтер чтобы дать возможность присваивать nil (NULL) значению. Попробуй unique,not_null или что-то вроде того. gorm не юзал никогда.
А вообще лучше юзать reform, т.к. там кодогенерация и скорость работы с базой выше. У неё правда есть свои минусы, например отсутствие композитных PK.
Пиздец, нет ни одного нормального фреймворка, ни орм. Все криво, уебищно, примитивно. Выкатываюсь к ебени матери
Звучит как нечто не связанное с самим языком.
Есть ли аналоги на других языках?
Есть ли где-то вменяемое описание подхода, его преимуществ?
Это не связано с языком, это принцип построения архитектуры
Код не мой, а с курсов хуевых
type KekController struct {
repo repository.KekRepository
}
func NewKekController(repo repository.KekRepository) *KekController {
return &KekController{repo}
}
Двощ съел астериски
> по умолчанию буфер равен 1
Заебали, буфер по умолчанию -- 0. Буфер размера 1 -- тоже полезная штука, но объявляется явно.
я сразу на мидла вкатился, без особого понятия.
До этого только парсер двача на го писал.
Не ссы, научат. Меня вот учат.
Быстро-быстро читай Effective Go, там текста на длинный вечер, а пользы джуну дохуя
Можно реализовать сервис контейнер, самый простой и очевидный вариант.
Также в го есть пакет reflect, может пригодится, если хочешь в рантайме разруливать хотя ты быстро поймешь, что в го это нинужно
Сап программач
Есть регулярка вида ^blabla([\w]+)$
Как грамотно проверить строку на соответствие регулярке и вытащить группу?
С помощью стандартной библиотеки
Аноны, будут ли выводиться строки или любые другие штуки из слайса в порядке их добавления?
Ну это смотря как ты их добавлял.
Ну и как будешь выводить.
Если делал, скажем, апенд, а теперь делаешь ранже (мне сложно переключать раскладку бля!) то ответ д
Он действительно такой примитивный или это только на первый взгляд так кажется? Где можно прочитать что-то для более глубокого понимания?
An Introduction to Programming in Go
Нормально ли, что файл, относящийся к пакету main, лежит не в корне, а в отдельной директории? Или за такое в го мире принято пиздить ногами?
Это распостраненная тактика, когда есть папка типа cmd, а там внутри папки app_name1, app_name2, а каждой main - если у тебя несколько приложений собираются из общих исходников.
https://github.com/golang-standards/project-layout/tree/master/cmd
Го достаточно простой язык с точки зрения синтаксиса, это была одна из его целей. Но подводные камни там есть, погугли "50 оттенков Go"
В моем случае это папка с консольными командами
ты прав:3
Не понимаю, чому использовать префикс Get зашкварно, а New нет
Ничего зашкварного нет, совершенно нормальная практика. Меньше всяких кукаретиков слушай.
Такой лютой ебанины увидеть в конце 2010х я не ожидал.
Конструкции и синтаксис блять, как-будто школьник макросов для сишки написал и назвал это языком.
Экосистема, как если в 90х появился гитхаб и какой-то хипстер сделал революционное предложение - а давайте пекеджи неймспейсить по репозиторию.
Код пишут так, как-будто лабу на первом курсе.
Ну блять, я хуй знает. Может быть в мире компилируемых языков это и революция, но писать на таком и читать эту блевотину после питона или тем более руби, просто невозможно.
А писать на нем, как я посмотрю, пытаются очень много. Ну ладно там какое-нибудь очень узкое место сделать, по типу работы декодер-энкодер там лихой или там реал-тайм-веб какой-нибудь. Но они же блять свои неуклюжие ОРМки прикручивают и начинают ручками круды описывать. Бляяять. Такое километровое уебанство, где одна строчка сути на питоне == 100 строкам мозгоебства на этом го, за которыми уже не видно ни какой сути.
А, еще забыл добавить.
Что уж там говорить об архитектуре. Понятное дело, им бы справиться с километрами своих байтов, не до абстракций. Повторить валидацию в на создании и обновлении - пфф, это дело десятое. Главное что он ЗАТАЩИЛ это, он-таки вывез этот километр ифов, лупов и структур, оно блять у него заработало. А то что там он валидацию покопистил - так это так, пыль на сапогах.
в чёт проблема языка если твой коллега макака взял гранату для забивания гвоздя и лупит по гвоздю ?
Так микросервисы же, ептить. А как? Он взял и написал микросервис комментариев. Комментарии в базе. Их можно создавать и обновлять. Казалось бы.
и это пиздец какое узкое место в приложении ? а микросервис страницы логина не хотите на хаскель переписать ?
Ах, и еще этот незабываемый вкус того времени, когда таблицы и поля в базах еще не научились именовать. Ну реально, как-будто лет на 15 назад в прошлое вернулся.
Да конечно оно не узкое, просто игрушку в руки дали, "мы теперь будем писать на микросервисах все".
>а микросервис страницы логина не хотите на хаскель переписать
Уже. Собираются переписывать на го.
а вы говорите свичерчы не трабыл для професси , уже не первый раз вижу когда в компании , почитав статейки , даун номер 1 пытается всё новомодное вхуярить в проект , хотя не кто не имеет в этом опыта , а другие дауны и рады , хули хотели выучить язык\фрейм\другую поеботу а дома как бы и в падлу , давайте вливать всё говно в проект , правильно или нет да похуй...
Через год этот даун сменит место на более прибыльное, а ты нет, потому что у него будет дополнительная строчка в резюме и год работы с модной хуйней.
палю годноту , что бы добавить строчку в резюме не нужно пилить говно , можно даже её просто взять и добавить
у норм лида шанс обосратся что ты нихуя не знаешь или знаешь хуёва примерно === , у лида который и сам нехуя не шарит вытянит харизма
Недавно вкатился в го, пытаюсь заюзать go mod. Есть собственно два модуля вне gopath, оба инициализированы как модули (go mod init modules/first и go mod init modules/second), однако импортировать один в другой нельзя (import "modules/second"), билд жалуется на то что импортируемый модуль не существует. Как, собственно, нормально импортировать один го модуль в другой, да так чтоб ничего никуда не пушить и сидеть при этом вне gopath?
Вопросик порешан
Goвняшка - для пидоровнебинарных трансгендерных людей, пруфвидео:
https://www.youtube.com/watch?v=ZACOc-NwV0c
лол
Как православно запилить итератор для структуры?
В го такое не канон, используй мапы тогда уж.
А тебе зачем? Уж не пидор ли ты часом?
Ты просто не шаришь. Го со всей его неуклюжей простотой - это просто глоток свежего воздуха после какой нибудь джавы, JS'а или, прости господи, PHP.
Как раз недавно пришлось подключиться и поработать с кодом, который писали вдохновлённые миддлоджуниоры - они постоянно норовят написать свой велосипед, усложнить задачу на пустом месте, захуячить декоратор ради декоратора и так далее. Доходит до того, что боишься даже объект класса создавать, потому что мало ли, чего там в конструкторе понаписали и как это себя поведёт.
Как пример из моей практики, была либа от, вроде бы Stripe, где в деструкторе какого-то класса то ли делался запрос, то ли ещё что-то. И эта сука вызывала падение - причём, посколько это деструктор, то падение происходило в конце функции, при том, что объект был создан где-то до этого.
Я вот сейчас пишу фронтенд и охуеваю от количества магии и сахара на тайпскрипте и в ангуляре. И хуй его знает, что я буду делать, если внутри это магии что-то начнёт работать не так.
В го, к счастью, вырезали всю магию. Да, он простой до примитивизма. Да, многословный. Да, приходится иногда копипастить код. Да, в нём нет сахара. Но в этом-то и плюс!
Потому что легко сделать сложно, но сложно сделать просто.
Он заставляет писать очевидный код, который работает именно так, как ты думаешь. Ничего не создаётся из ничего и никуда не уходит, если явно не прописано.
Огромный плюс в мире софта написанного любителями.
Не говорю, что в го нет минусов, они очевидно есть. Чувствуется влияние сишников, которые все последние двадцать лет сидели где-то в своей дыре, не выглядывая наружу и продолжают, как раньше, тянуть свои невразумительные практики (все эти "менеджер пакетов не нужон! вендор надо класть под гит! gopath - это правильно и весь код должен лежать в одном месте! переменные по одному символу!).
Выдать бы сишникам пиздюлей, добавить дженерики и разобраться с обработкой ошибок (текущая ситуация мне не особенно нравится) + подумать над указателями на интерфейсы (слишком мерзкие ошибки случаются) - и будет конфетка, а не язык.
Но несмотря на все недостатки (а какой язык без них?), он уже сейчас мне нравится больше конкурентов.
Ты просто не шаришь. Го со всей его неуклюжей простотой - это просто глоток свежего воздуха после какой нибудь джавы, JS'а или, прости господи, PHP.
Как раз недавно пришлось подключиться и поработать с кодом, который писали вдохновлённые миддлоджуниоры - они постоянно норовят написать свой велосипед, усложнить задачу на пустом месте, захуячить декоратор ради декоратора и так далее. Доходит до того, что боишься даже объект класса создавать, потому что мало ли, чего там в конструкторе понаписали и как это себя поведёт.
Как пример из моей практики, была либа от, вроде бы Stripe, где в деструкторе какого-то класса то ли делался запрос, то ли ещё что-то. И эта сука вызывала падение - причём, посколько это деструктор, то падение происходило в конце функции, при том, что объект был создан где-то до этого.
Я вот сейчас пишу фронтенд и охуеваю от количества магии и сахара на тайпскрипте и в ангуляре. И хуй его знает, что я буду делать, если внутри это магии что-то начнёт работать не так.
В го, к счастью, вырезали всю магию. Да, он простой до примитивизма. Да, многословный. Да, приходится иногда копипастить код. Да, в нём нет сахара. Но в этом-то и плюс!
Потому что легко сделать сложно, но сложно сделать просто.
Он заставляет писать очевидный код, который работает именно так, как ты думаешь. Ничего не создаётся из ничего и никуда не уходит, если явно не прописано.
Огромный плюс в мире софта написанного любителями.
Не говорю, что в го нет минусов, они очевидно есть. Чувствуется влияние сишников, которые все последние двадцать лет сидели где-то в своей дыре, не выглядывая наружу и продолжают, как раньше, тянуть свои невразумительные практики (все эти "менеджер пакетов не нужон! вендор надо класть под гит! gopath - это правильно и весь код должен лежать в одном месте! переменные по одному символу!).
Выдать бы сишникам пиздюлей, добавить дженерики и разобраться с обработкой ошибок (текущая ситуация мне не особенно нравится) + подумать над указателями на интерфейсы (слишком мерзкие ошибки случаются) - и будет конфетка, а не язык.
Но несмотря на все недостатки (а какой язык без них?), он уже сейчас мне нравится больше конкурентов.
>Но в этом-то и плюс!
>он уже сейчас мне нравится больше конкурентов.
Потому что ты кроме жс и пхп ни с чем не знаком.
мимо-капитан
Примерно то же самое, а во многих моментах даже хуже. После жавы и плюсов и жс покажется удивительно выразительным языком.
Тогда нам незачем спорить, ты просто из другого мира. Дальше будет совсем вкусовщина.
Поясните за указатели, допустим я передаю в функцию ссылку на этот слайс, как правильно обработать внутри функи, чтобы вернуть только срез, при этом модифицировать слайс убрав из него этот срез.
Я понимаю как сделать типа такого
func Bla(index int, arr []int) ([]int, []int) {
...
}
abc := []int{0,1,2,3,4}
var bca []int
bca, abc = Bla(2,abc)
Как сделать это с этими ебучими ссылками и указателями, чтобы возвращался только срез при том модифицировался слайс abc?
Разобрался без вас, пидорасов.
func RemoveIndex(index int, d []int) []int {
var v []int
locker.RLock()
for i := 0; i < index+1; i++ {
v = append(v, (d))
}
d = append((d)[:0], (*d)[index+1:]...)
locker.RUnlock()
return v
}
Для начала прочитай что такое слайс в Го и больше не произноси бред вроде "ссылки на слайс". Это тебе не массив в С, довн.
Товарищи суслики, поясните, пожалуйста. Только вкатываюсь в го, но на работе уже требуют чтобы что-то на нём делал что правильно, в общем-то
Короче, ситуация такая. Мне нужно слушать топик по mqtt и обрабатывать приходящие данные. Но не суть. Вопрос в чём, при выходе, мне нужно закрывать соединение и останавливать горутину. Нагугленные решения мне показались слишком костыльными. Поэтому я подставил свой костыль. Вначале объявляю в глобальном скоупе переменную alive := true ну и просто меняю на false при выходе. Мудрые аноны, подскажите, всё правильно сделал или это "бэдпрактис" и надо иначе?
Код скрином, чтобы тред не засирать и всякими пастбинами не пользоваться. Не люблю их.
Спасибо, анон!
Потому что к ссылкам добавилась запятая.
https://www.golang-book.com/
https://github.com/dariubs/GoBooks
Оу, спасибо.
Если в строке есть запятая, то он читает в буфер ровно до неё, саму запятую, потом съедает любое количество пробелов и один символ из оставшейся строки. Это так и задумано?
Input processed by verbs is implicitly space-delimited: the implementation of every verb except %c starts by discarding leading spaces from the remaining input, and the %s verb (and %v reading into a string) stops consuming input at the first space or newline character.
Питон.
чёт ты как то х*ёва измеряешь
https://benchmarksgame-team.pages.debian.net/benchmarksgame/faster/go-python3.html
Пиздец, а в соседних тредах говорят, что 3к зарплаты им мало.
Твой вывод в консоль большую часть времени занимает.
И сам код покажи, конечно, а то хрен знает, что ты там понаписал.
Ну, сами по себе каналы concurent-safe. Другое дело, что никто не помешает тебе передавать через них указатели. Но это уже вопрос семантики происходящего, а не структуры канала.
go run собирает и запускает. А имеет смысл запускать уже собранное
Более того, "канал" - это просто очередь с мьютексом, без особой магии. В исходниках довольно очевидно всё написано.
до этого фуллтаймил на js, больше всего времени ушло на еблю с gopath / go modules и ide (в итоге взял goland)
Inspiring story, bro.
go
50 оттенков Го почитай
Как писать на го? Как питоноблядь скрипты? Я нихуя не понимаю, объясните пожалуйста, это язык для производительности, или чтобы писать хуйню вокруг чёрного ящика, делающую 100500 аллокаций каждую секунду?
>чтобы понять чем по сути является слайс
Слайс это структура, в которой лежит указатель на массив, длина слайса и капасити.
По сути слайсы - это динамические массивы, сделанные как структура над обычными.
ну я так и думал
ну тогда использовать их как листы — пиздец неэкономично, тут быстродействием занимаются, или простым написанием программ?
Так как писать то? Экономя каждый вызов, каждую аллокацию, или ебашить append к слайсу в цикле?
я про в принципе стиль написания, а не конкретную задачу
Почитай https://golang.org/doc/code.html#Introduction
чтобы закрепить навыки.
Потом можно отполировать Effective Go и уже будешь чувствовать go-way.
Если хочешь писать как на Си, может лучше писать на Си?
Почитал про Go, работаю писядмином, меня подкупает возможность компиляции кода в нативный бинарник на вообще любые платформы на работе имею дело с охуеть каким большим зоопарком устройств, от обычных пекарен до хуйни на армах
Стыдно говорить, но за 7+ лет на никсах я научился только писать простые скрипты на бидоне и портянки на баше. То есть знания ЯП околонулевые
Стоит ли?
А зачем тебе вообще что-то компилировать?
Пишу сейчас хуёвый веб на рнр (проект хуёвый и сам я тоже хуёвый). Хотелось бы выкатиться с текущего проекта.
Смотрю вакансии - очень много говна где нужны знания css/js, хотелось бы быть как можно дальше от этого говна.
Ещё могу в питно, но там почти та же история - почти все вакансии это джанга или дата ссайнс.
Подумал вкатиться в го. Язык, конечно, так себе, если сравнить с каким-нибудь котлином или окамлом, или кложей (языки с которыми я игрался и немного знаком).
Но, есть вакансии, язык молодой и могут взять без особого опыта наверное, и самое главное фронтендовой параши нигде нет в требованиях.
Короче, хотелось бы избежать монотонных крудов и UI.
У го вроде бы ниша это высоконагруженные сервисы, мультитрединг из коробки и вот это всё, звучит интересно.
Стоит ли мне вкатываться с такими потребностями?
>могут взять без особого опыта наверное
Маловероятно, язык не такой уж молодой
>>407835
>и самое главное фронтендовой параши нигде нет в требованиях.
Иногда встречаются фулстеки, но все-таки го - это чисто бэкенд
>>407835
>Короче, хотелось бы избежать монотонных крудов и UI.
>У го вроде бы ниша это высоконагруженные сервисы, мультитрединг из коробки и вот это всё, звучит интересно.
Ниша - да, но проекты встречаются как и нагруженные сервисы, так и круды. Тут как повезет.
>>407835
>Стоит ли мне вкатываться с такими потребностями?
Тебе решать, но не факт, что тебя возьмут без опыта в го. Попили хотя бы пет-проектов на нем, вдруг разочаруешься.
>но не факт, что тебя возьмут без опыта в го
Ну, я имел в виду коммерческий. Проскакивали вакансии с опытом рнр или питона, отсюда и вывод, собственно.
Так-то дома попилить, конечно, надо будет, и для себя и для CV.
Есть такие вакансии, в которых суть - переписать с пхп на го
да нормально все, не зацикливайся только на подобных практиках
Читаешь доки и прямо воодушевляешься.
А потом смотришь на такие картинки и ощущаешь себя ретардом в спецклассе.
няшнота же
я вот учу джаваскрипт и завидую что у вас есть няшка маскот а у джс нет
пусть тоже придумают что нибудь, я себе плюшевую игрушку закажу -_-
Бамп
А ты представляй что это типа такая самоирония, доступная для понимания только увереным и mature людям. Понятно что шкальникам такой маскот не будет нравиться - но в этом то и суть.
>Читаешь доки и прямо воодушевляешься.
Воодушевляешься тем что можно дальше не напрягать мозг и фигачить простынки из if err != nil и interface{}?
>фигачить простынки из if err != nil
Может, добавят try
https://github.com/golang/go/issues/32437
Всегда проигрываю, когда кто-нибудь хвастает "а вот в нашем языке можно в утф-16 называть переменные!"
А потом, такие, "о, бля, а как это у тебя дженерики, а у меня не работает?"
ну что ебаных конструкторов нормальных не завезли. Что есть структура с мапой внутри, и чтобы этой мапой пользоваться надо извращаться.
Неочевидная херня получается, ты никогда не знаешь, какую именно ошибку из какого блока ты будешь обрабатывать своим "catch"ем. Это как бы убивает то, ради чего вообще начинали сыр-бор:
идеологам го не нравилось, что ты можешь понапихать в try {} catch{} понапихать кучу кода и обрабатывать вообще всё оттуда в одном месте, вроде как это слишком непрозачно.
И поэтому они решили заставить всех делать if'ы после каждой строчки кода, чтобы явно заставить тебя обрабатывать ошибки конкретно из этой функции в своём отдельном месте.
Конструктор - это просто функция. Создай функцию NewYourObject() и иди себе с миром.
Ну или `func (obj *YourObj) Construct()`, если хочется обмазываться извращениями.
и как же мне заставить додиков пользоваться конструктором, не созданием структуры? Если написать с маленькой буквы то внутри пакета все равно можно будет пользоваться struct{}, и выглядит это ужасно, тяжело становится понимать, где тип, а где нет.
Например, ты можешь не экспортировать эту структуру (назови её с маленькой буквы). Или не экспортируй нужные поля (называй их с маленькой буквы).
ну го должен был быть dumbed down, а если я перестану беречь свои колени, то я пойду на node js писать без типов.
линки на книги битые, ну еб твою
Убери запятую в конце адреса.
>и как же мне заставить додиков пользоваться конструктором, не созданием структуры?
Джентельменское соглашение.
Вон у пиндо в питоне в мануале прямо написано:
- Разработчик апи объявил в классе переменную с двумя андерскорами, а я все равно ее прочту))
- Ну нинад плиз(
Рефлексия не нужна в большинстве случаев, т.к. она бьёт по перфомансу, а если перфоманс не критичен, то удобнее взять что-то более гибкое, типа скриптовщины какой-нибудь.
Вместо рефлексии нужно использовать кодогенерацию, если это возможно (типа го-вей).
Вместо того, чтобы в рантайме смотреть на тип и что-то делать исходя из типа, заранее напиши тулзовину, которая будет принимать список типов и генерить типизированнй код. По аналогии с cheekybits/genny или hexdigest/gowrap,
В го отличный парсер и прочий тулчеин, я свой первый генератор написал за 2 часа (причём второй час бился с шаблонизатором). Следующий напишу за полчаса-час по необходимости.
> я свой первый генератор написал за 2 часа (причём второй час бился с шаблонизатором). Следующий напишу за полчаса-час по необходимости
Но дженерики нинужны, ага.
Хз, не понимаю, чего все дрочат на отсутствие дженериков. Честно, за всё время моей работы они мне понадобились раза два. Оба раза я даже не генерируя код написал всё руками. Чуть менее элегантно, согласен.
Но это не такая уж и большая проблема, какой её раздувают. Интерфейсы, кодогенерация и, по большой необходимости, рефлексия решают все те же задачи, просто другим способом.
Если уж хотите доебаться до го, доябывайтесь до nillable интерфейсов или обработки ошибок хотя бы.
> обработки ошибок
Она не так уж плоха, мне больше нравится, чем неявная работа с исключениями. Единственный минус - это обилие кода типа
if err != nil{
return nil,err
}
Но это пытаются пофиксить различными пропозалами
Так вот, зачем закрывать файл?
firstFile, err := os.Open(os.Args[1])
if err != nil { panic(err) }
>defer firstFile.Close()
Вот это вот.
Потому что количество дескрипторов не бесконечно.
Ну и чтобы два раза капчу не воодить: VS Code vs GoLand - кроме легковестности у VS Code есть еще преимущества? Отладка там как, нормальная?
Голанд срет своим конфигом тебе прямо в $HOME, а vscode тоже в хоум, и в .config, блядь, везде насрано.
Скажите, что вим умеет показывать докстринг для импортируемой функции, и я на него перекачусь.
Она не плоха, но возникают проблемы с идентификацией ошибок и добавлением контекста в ошибки.
> Ну и чтобы два раза капчу не воодить: VS Code vs GoLand - кроме легковестности у VS Code есть еще преимущества? Отладка там как, нормальная?
Дебаггер у vs code вроде как лучше.
Мне лично студия почему-то не зашла, пользуюсь IDEA. Но я уже лет 5 их IDE'хами пользуюсь, выработалось много привычек, больно без удобных привычных кнопочек, которые ты уже знаешь, где лежат и как найти.
тут ещё стоит добавить, что рефлексия в го довольно всратая, как и система типов. например, нельзя скастовать тип полученный из рефлексии на интерфейс.
Emacs точно умеет.
>Читай про go modules - это к вопросу о менеджере зависимостей
Go modules - прикольней чем glide или go get.
А что со сборкой проекта? Makefile, gödel или еще что-то?
Спасибо анончег.
Непонятно, почему "нельзя". Что ты хочешь сделать и чего у тебя не получается? Покажи код.
Нельзя из-за парадаксальной ситуации, потому что reflect.TypeOf, внезапно, не может возвращать тип и его результат "is not a type".
пример
https://play.golang.org/p/-58cxNN5QWL
Ты пытаешься какую-то странную хрень сделать, закастить тип первого аргумента, в аргумент второго аргумента. Не говоря уже о том, что код просто некорректно написан и не скомпилируется.
Напиши реальный юзкейз, когда тебе понадобиться так сделать. Пока что выглядит так, что ты пытаешь программировать на го на пехапе и у тебя не выходит.
В этом и суть, что оно не компилируется, а должно. Смотри:
1) каст всегда выполняется к типу x.(type)
2) функция typeOf по логике должна возвращать тип, иначе нахуя её так называть? Сделали бы тогда wtfOf, чтобы голову не морочить.
3) значит каст должен работать x.(typeOf(x)), но хер там, потому typeOf возвращает хз что.
Да, это нерабочий код, но какого хуя?
Хуёво, чо. И название метода косое, и тип невозможно на лету получить и кастонуть как обычно. Только костыли ебические с call как на примеие анона выше.
ты тредом ошибся, удобства в языке для вонабикрасноглазиков-но-неосиляторов искать -- глупо.
А какой язык для осиляторов? Си? Кроме 0,5% разработчиков он никому уже нинужен. Плюсы? Такая же шняга как го, только в придачу еще многоэтажный шалаш из костылей.
Щас бы придираться к отсутствию динамического кастинга в статическом языке. Я бы у вас вообще рефлексию отобрал, ибо нефиг, одно говно пишете с ней.
ну а хуле поделать, альтернатив нет. грин треды есть еще только в эрланге и хаскеле... и на этом всё.
а без грин тредов в 2к19 - вообще хуйня ебаная, это проститетльно только для системных языков их не иметь.
https://go.googlesource.com/proposal/+/master/design/32437-try-builtin.md
В общем, есть штука. Функция database.Connect() это то же что и sql.Open(), только вынес в одну функцию сразу и чтение параметров подключения, и всю эту чепуху.
Проблема в чём. При ограниченном MaxIdleConns, на сервере всё равно плодится хуева туча этих висящих подключений. Из-за чего БД в какой-то момент, естественно, перестаёт принимать подключения. Как фиксить? Месседж хендлер обрабатывает входящие данные и пишет результат в БД. Пробовал и defer db.Close(), всё равно эти мёртвые подключения висят. И даже с ограниченным лайфтаймом никуда не деваются. Всё что debug_user это подключения от моего обработчика.
ЕМНИП, стандартная библиотека по умолчанию реализует пул коннектов. Но db.Close() должен помогать.
Код у тебя конечно пиздец.
Если выложишь пример в 20 строк кода (выкинь всё лишнее), который я смогу локально запустить (и скажешь, что именно тебе в нём не нравится) - посмотрю.
То есть, как я понимаю, лучше для каждого хендлера открывать коннект отдельно и после записи мануально его закрывать, верно?
Вот так сделал, и всё равно idle висит в БД. Не понимаю как этот пул работает.
https://pastebin.com/SgmK0c4W
10 сообщений пришло и все 10 соединений висят.
Синглтон
В Эрланге нет грин тредов, там акторы, а акторы есть и для Java, Scala, .Net, да даже C++.
Для асинхронных методов в .Net - async/await, в JVM - Kotlin coroutines.
В ерланге процессы попизже сцаных гринтредов.
И причём тут акторы? Модель актров - это просто модель, имплементации могут отличаться.
[irony]Там 3.14здатые строки в виде массивов чаров[/irony]
[code]
if l.flag&Ldate != 0 {
year, month, day := t.Date()
itoa(buf, year, 4)
buf = append(buf, '/')
itoa(buf, int(month), 2)
buf = append(buf, '/')
itoa(buf, day, 2)
buf = append(buf, ' ')
}
[/code]
Что теперь? Искать на гитхабе васянские пекеджи? Это прямо какой-то perl с TIMTOWTDI.
Разметку проебал, все проебал, так себе неделя.
Главное не берите логгер от убера, там такой пиздец, будто данные со спутника логировать собираешься.
А мне норм.
Я ж скозал, получится перл. Зере из моар зен уан вей ту ду ит, а на деле это означает "сделай сам". То есть, начинаешь кодить проект, а логер не кастомизируется. Напиши свой! Ну или ищи на гитхабе логер от васяна, но и с претензиями тоже к васяну иди.
В чём проблема? В го есть стандартный форматтер даты. Если в логгере хардкод - перепиши его и плюнь в морду/репозиторий автору-говнокодеру
Меня сейчас совершенно вымораживают конструкции типа
var myname string
fmt.Scanf("%s", &myname)
- Где аллоцируется myname? На стеке?
- А что будет если Scanf() отдаст ссылку на &myname куда-то еще и она переживет возвтрат из основной функции?
goku := &Saiyan{"Goku", 9000}
Super(goku)
fmt.Println(goku.Power)
}
func Super(s *Saiyan) {
s.Power += 10000
}
Пиздец, почему примеры из книжки не работают?
The Little Go Book.
Ну потому что надо добавить минимальную обвязку импорты, пекеджи и типы
https://play.golang.org/p/AzNOZExkbsY
Импорт и пекедж добавлял, насчет типа понял, спасибо!
func main() {
s := []int{2, 3, 5, 7, 11, 13}
s = s[1:4]
fmt.Println(s)
Вот тут например получается [3 5 7], т.е. слайс 1 элемента = 3 включен, а 4 элемент = 11 нет?
Современная индустрия - либо галеры, либо легаси-говнище либо сомнительные стартапы.
Да хз ну просто кучу разноработы как на том же питоне, например. Понятно, что вакансий на го я и не ожидал увидеть столько же, сколько на питоне, да хуй бы с ним даже если бы их в 20 раз меньше было, но само качество вакансий это же полный пиздец.
Ты выбрал элементы с первого по четвёртый, логично, что ты их и получил.
Так будет понятнее (надеюсь, двач не побъет отступы):
| a | b | c | d | e | f | g | h | i |
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
------^-----------^
Т.е. ты взял все элементы начиная с индекса 1, заканчивая индексом 4.
Я еще с питоновских слайсов запомнил, что первая скобка интервала квадратная, а вторая круглая.
Го ещё молод - это во первых.
Во вторых, основные ниши - это высоконагруженные (микро)сервисы (а как правило высоконагруженные сервисы быстро приносят бабло и сами превращаются в кровавый энтерпрайз) либо блокчейны.
Есть мнение, что со временем го распробуют, полюбят за низкий порог входа и го станет языком для быстрого прототипирования (как сейчас php или nodejs).
> Si fueris Romae, Romano vivito more, Si fueris alibi, vivito sicut ibi. - Если ты в Риме - живи как Римлянин, в других местах - живи (веди себя) как местный.
В питоне пиши на питоне, в го пиши на го.
> Если ты в Риме - живи как Римлянин, в других местах - живи (веди себя) как местный.
Вот римляне огребли и в Риме и в других местах.
TIL что алиби в прямом смысле означает "в другом месте"
> from Latin alibī (“elsewhere, at another place”, adverb).
Если сбилдить и запустить например:
main.exe http://vk.com > test.html
В переменной test оказывается вот это:
Test%!(EXTRA int64=9285)
Откуда берется %! и int после него? Я понимаю, что это общее количество спаршенных символов, но я же нигде не указывал что хочу их видеть. У меня немного едет логика, когда я думаю о том чтобы писать _, err (и последующим сравнением err != nil), вместо того чтобы просто юзать err:= copy ... без _ и вот этих EXTRA int, которые в нем находятся.
<оффтоп><нет политосрачу>Ну так-то они построили государство, которое просуществовало полторы тысячи лет (считая Восточную), их язык является основой для большинства современных, включая международный, а их культура до сих пор живёт и здравствует, как часть массовой (легионы, император, гладиаторы и тысячи прочих моделей).
Для сравнения:
- Российская империя просуществовала 196 лет и практически ничем сравнимым с римскими легионами в массовой культуре не отметилась.
- Советский союз просуществовал 69 лет, и помнят его только потому, что и он сам, и холодная война были сравнительно недавно и ещё живы те, кто видел всё своими глазами. (спустя ещё сто лет и пару мировых войн, боюсь, в массовой культуре он будет значить столько же, сколько Австро-Венгрия).
- РФ существует всего 28 лет.
</нет политосрачу></оффтоп>
>высоконагруженные (микро)сервисы
для вкатывания в которые все требуют готовый опыт участия в других высоконагруженных проектах = джуниоры идут нахуй. мне так-то похуй, я с 2005 года в индустрии, но если нет потока джунов, то за счёт чего технология будет взлетать?
>за низкий порог входа
ну это он технически может и низкий, хотя я бы тоже поспорил, потому что то же выравнивание структур по границам это ну нихуя не низкий уровень. а организационно там вообще порог пиздец -- см предыдущий абзац.
так что я бы может и хотел на го писать, но я чёт хочу кушать. а там не кормят особо. а для прототипирования для себя мне проще взять ту же ноду и не ебать мозга себе и окружающим.
Ты не сечёшь фишку.
Го очень простой, на самом деле. Тебе не придётся объяснять джуниору тонкости наследования, арифметику указателей, async-await, реактивщину и прочие концепции.
При условии, что он не тупой и у него есть знания хотя бы на уровне семестра погроммирования на сипаскалепитоне из института,ты клонишь ему проект, увешнный гошными линтерами и рейс-детектерами (а это очень просто настроить), объясняешь "короч пиши go перед кодом и он выполнится в другом потоке, потом верни результат через канал" - и он пишет код, который потом очень легко ревьювить, по сравнению с каким-нибудь джаваскриптом. Снижается когнитивная нагрузка на тебя-тимлида. А, так как микросервисы, то нужен один или два головастых архитектора, кто продумают взаимодействие между микросервисами и напишут интерфейсы (к примеру, proto-файлы в отдельном репозитории).
После этого, джуниоров можно запускать в маленькие приложения, там минимум кода, хрен они что тебе сломают там, пусть говнокодят и учатся. Линтеры поймают 90% ошибок, ты пробежишь глазами и поймаешь ещё 9%.
Можно так делать и на какой-нибудь пыхе, только го намного производительнее (и всё ещё очень просто).
Мои мысли описал. Особенно про пиздюлей сишникам.
По этой же логике не может быть ждунов по любому языку, который не входит в универскую программу.
Сейчас есть и курсы по го, и в некоторые конторы берут стажеров, и некоторые разрабы переучиваются с питона и пхп на го. Так что количество го разработчиков постепенно растет.
>>431673
>выравнивание структур по границам
Это штука, которая, насколько я знаю, почти никогда не нужна, и о ней многие знают, только потому что на нее есть линтер.
>>431866
Это всё как-то не вяжется с тем, что на данный конкретный момент все вакансии по golang, которые вообще имеет смысл рассматривать, включают в себя знание как минимум реляционных субд, а лучше ещё и nosql, а так же знание сетевого стека. Во многих вакансиях ещё блокчейн. Много где требуется знание основ фронтэнда. Много где вообще без задней мысли хотят ещё С++ или тот же Python.
>Я вот сейчас пишу фронтенд и охуеваю от количества магии и сахара на тайпскрипте и в ангуляре.
С го будет то же самое. В 2010 году исходники бэкбона тоже мог прочитать любой желающий целиком и многие читали, я в том числе.
С тем же успехом можно сказать, что все вакансии по джаве требуют спринг и тд
Сейчас бы возмущаться, что на бекенде кроме ЯП нужно знать ещё БД, сетевой стек и основы фронтенда.
Просто общепринятая практика: полуоткрытый диапазон.
Слайс на весь массив будет [0:len]
Цикл for i := 0; i < n; i++
rand.Intn(n) выдает [0,n)
В общем так принято, левая граница включается правая нет. Глубокого замысла в этом нет, просто так исторически сложилось. В других языках то же так же.
Мы вам не перезвоним.
Вкатываюсь из питона. Подскажите, что нужно знать на уровень мидла? Ну кроме очевидных как работает язык, архитектуру микросервисов, кэши, докеры, бд.
Очевидно, как работает язык, сложившиеся практики работы с языком и прочие паттерны (не всегда ООПшные) + тулчеин и набор маст-хев библиотек.
Ищем рокстар го-сеньора 15+ лет опыта. Требования:
- знать
>как работает язык, сложившиеся практики работы с языком и прочие паттерны (не всегда ООПшные) + тулчеин и набор маст-хев библиотек.
- жить в нищей стране третьего мира, но в нашем часовом поясе
- Ангулар.жс
Они это серьезно?
Ну а ты чего хотел? Пока есть индусы, украинцы и прочие мексиканцы, которые готовы на всё за еду - их и будут искать.
Как говориться, у бизнеса никогда нет денег сделать всё хорошо сразу, зато всегда есть деньги сделать фичу два раза.
Я-то читал и знаю. Сначала ищется pyc файл. Если не находится, то берется файл py. Он компилируется в байт-код и дальше использует именно байт-код. Отличие только, что нужно специальную джава-ебанину-машину ставить, а в питоне интерпретатор содержит средства для работы с байт-кодом.
резалт - не структура, а слайс анонимных структур
CurrentItemStruct.Result undefined (type CurrentItemStruct has no method Result)
Блядь, вообще ничего не понимаю. Как разобраться в этом?
Инициализируй структуру
Братюнь, байт-код то который, кстати, почти 1:1 соответствует исходному коду, оптимизатор в питоне - не пришей пизде рукав интерпретируется.
Иди обратно в /vg.
Лiл, имиджборду с поддержкой quic. С коброй и вайпером.
Основная горутина запускает несколько горутин, забирает результат от самой быстрой, остальные тихонько завершаются.
Вот код, написанный как сказано в документации:
https://play.golang.org/p/YRmBM4bOf_2
Вот код, который работает, как ожидается:
https://play.golang.org/p/cKWS4K6Z8Rq
Вопрос 1: почему в первом случае select не ловит ctx.Done()?
Вопрос 2: почему в первом случае select ловит ctx.Done(), если канал объявить небуферизированным?
Предположу, что в первом случае все траблы из-за того, что происходят два события одновременно: получение ctx.Done() и запись в канал out. И видимо, select выбирает случайным образом, какое событие обработать.
Да, ты прав:
A select blocks until one of its cases can run, then it executes that case. It chooses one at random if multiple are ready.
Если сделать result небуферизированным каналом, то все работает ок.
А из-за рандомности селекта не все воркеры ведут себя одинаково.
При использовании корутин контекст меняется явно, посредством вызова yield. Го-рутины переключаются планировшиком (там целая пачка условий, таймауты, директивы и прочее).
>>437409
Не гопник.
Чем тогда горутины отличаются от тредов не по ресурсам, а по программированию? Как обработка критических секций осуществляется, тоже всё подряд надо лочить? То есть фактически это треды, а не корутины?
Корутины хороши тем, что я сам разрешаю переключение задач и знаю, когда может переключиться, а когда не может.
Рассматривать горутины отдельно от каналов смысла нет.
Ну язык немного подрастет и станет популярным и тут ты такой открытый для предложений.
11
Тут по желанию, зависит от сложности запросов. Иногда орма просто не хватает, ну и голый запрос проще протестировать, потому что там понятно, что в базу идет
Ещё раз.
Есть треды, это прикольно, но тяжело - потому что процессору нужно тратить много времени на порождение треда + переключение контекста между тредами + нужно как-то самому реализовывать передачу данных между тредами.
А есть "зелёные треды", идея которых в том, что у тебя есть какой-то рантайм (го/котлин/any), который занимает сколько-то системных потоков. А уже внутри рантайма есть своя абстракция, легковесные "зелёные" потоки, которые как-то сами между собобой общаются, меняются и вообще делают, что хотят, потому что запущены внутри своей "виртуальной машины".
Реализаций концепций "легковесных потоков внутри своего рантайма" есть много, и все они чем-то отличаются. В частности, есть горутины в го и корутины в котлине. И то, и то - это грин треды, но у одних за переключение между легковесными потоками отвечает планировщик, а у других ты сам должен сказать рантайму "вот тут можешь что-нибудь поделать", ткнув свой yield.
Про программирование.
Очевидно, разные реализации требуют разных подходов. В го у тебя память доступна между всеми горутинами, можешь хоть через глобальные переменные передавать.
Но вообще для таких целей нужно использовать каналы (канал в го - это по сути обёртка с мьютексом вокруг очереди). Создал канал - прокинул его внутрь горутины, там записал, тут вычитал.
Но стоит учитывать, что каналы несут за собой накладные расходы, поэтому злоупотреблять ими не стоит.
Ну и да, по моему опыту, чаще всего распараллеливание происходит во время начала обработки чего-нибудь и в конце.
Грубо говоря, тебе пришёл запрос, роутер его обработал и сам породил горутину, в которой вызвал твой коллбек. Всё, у тебя отдельный поток на обработку этого запроса - а бизнес-логика обычно вполне себе линейна: прокинул запрос в базу либо другой сервис, получил ответ, посчитал что-то, записал, вернул ответ клиенту. Обычно в несколько потоков делаешь разве что одновременные запросы в несколько систем с последующей компоновкой результата, обработку какого-нибудь большого массива данных (в несколько потоков) либо отложенные операции вида "прогрей", "почисти", "пошли ассинхронно" и тому подобное.
И решаются такие задачи зачастую просто через замыкание + sync.WaitGroup
В го-мире есть куча ебанутых, которые тебе расскажут, что они пишут все запросы руками - и я водил их мам в кино, потому что когда доходит до +- сложных запросов эти сениор си девелоперы начинают городить лютую херню из конкатенаций и ручного экранирования всего и вся.
Другое дело, что большая часть орм'ок в го-мире основана на пустых интерфейсах, что нарушает все плюсы статической типизации.
Я бы использовал kallax либо reform, либо sqlboiler, они все основаны на кодогенерации и дадут тебе возможность писать так, как ты этого достоин - структуры, типы, fluent интерфейсы и всё такое.
И отдельно призываю тебя максимально внимательно отнестись к gorm. В мире нет никого более беспомощного, безответственного и безнравственного, чем человек, использующий эту дрянь: она мало того, что вместо join'ов делает select'ы и мерджит результаты на уровне приложения (а не базы), так ещё и втихую может похерить тебе какую-нибудь таблицу, если засунешь в любой меняющий состояние метод структуру с пустым первичным ключом.
Ага, условный model.Delete(User{}) заапдейтит тебе всю тублицу, если ты случайно структуру с пустым айдишником туда прокинешь.
Наверно надо просто прочитать про гринлеты и го, но лень, у меня вагон другого, что прочесть надо, и два вагона того, что сделать.
Всё-таки с точки зрения программирования, не думая о том, что под капотом.
Вот есть треды. Если я напишу в коде
print("say one")
print("say two")
то нет гарантии, что между ними чего-нибудь ещё не напечатается. А уровне питона даже нет гарантии, что c += 1 корректно выполнился в критической секции. Это особенность тредов. Что там внутри ОС или ЦПУ не важно.
Есть классические await.
пока я не сделал что-нибудь вроде await ...., у меня есть 100% гарантия, что переключения не произойдёт. Но чаще всего это всё работает на одном процессоре, то есть ресурсы не используются. Естественно, если делать
await print('one')
await print('two')
то тут уже потребуются локи для этого, но под корутины.
Верно ли, что в Го вся работа раскидывается системой по всем процессорам, а для программиста это выглядит как работа с корутинами, через await, и мне не надо думать о синхронизации между тредами?
> Верно ли, что в Го вся работа раскидывается системой по всем процессорам, а для программиста это выглядит как работа с корутинами, через await, и мне не надо думать о синхронизации между тредами?
Разница-то между типичным async/await и горутинами простая: в первом случае у тебя один ивент луп, в последнем у тебя их несколько, по одному-два на ядро.
Исходя из этого, если горутины не меняют общие ресурсы, то работать с ними будет также легко как с async/await. Если же меняют, то ты неизбежно огребёшь ад многопоточности с возможными дедлоками и порчей памяти объектов.
Но зато горутины хорошо перемалывают cpu-bound задачи, а не только io-bound, как async/await.
Воу, спасибо за такой развернутый ответ.
ну и заебись. как по мне так как сейчас удобнее, чем эксепшены. собственно, я и в других языках часто писал без эксепшенов, даже если они там были.
>1438596
Дополню, в голове удобно представлять каждую горутину, как отдельный тред, не думая о том, как оно там должно выполняться (на многоядерном компе будет выполняться одновременно несколько горутин, на одноядерном или с GOMAXPROCS=1 - это будет похоже на event loop, он будет выполнять все горутинны по чуть-чуть).
https://pastebin.com/pkp6qGef тут я сваял тебе пример, попробуй позапускать это с разными GOMAXPROCS - и сразу увидишь разницу, это будет или 1-1, 1-2, 1-3, ..., 2-1, 2-2, 2-3, ... в случае одного процессора, или 1-1, 2-1, 1-2, 3-1, ... в случае нескольких.
https://pastebin.com/P3ahRqmM а тут похожий пример, только с использованием каналов, чтобы было понятно, как их использовать.
> у каждого за душой страшная тайна
Страшная, но не тайна. Сколько они людей лоботомировали - не сосчитать, ужас просто.
Посмотрим как ты будешь выглядеть в 63 года, если вообще доживёшь. А дядьке с первой пикчи как раз столько и есть.
Это не проблема, поэтому её никак и не решаем. Почитай как организовано ООП в Go, перед тем как орать что это уебанство -- почитай про то, почему оно так сделано. Про Smalltalk, Objective-C и вот это всё.
В 63 люди становятся похожими на маньяков?
Если тебе так необходимо наличие свойств, то делай их через геттеры/сеттеры. Но скорее всего, они тебе не нужны.
Ещё один из мира формошлёпов что ли?
Интерфейсы определяют поведение, а не состояние, соответственно, нафиш там не нужны свойства.
Если тебе нужно передавать данные через интерфейс, ты или не знаешь про структуры, или делаешь что-то совсем неправильно.
Да, но я не взял трубку.
Приветствую. Как в этом языке отлаживать код, если компилятор гугловский?
>Уебывай отсюда.
Давай ты.
Ну так что гоферы, как отлаживать код имея только консоль и компилятор?
Как можно работать без полноценной отладки? Это ж дурдом какой-то. Читаю сейчас за Delve и GDB вроде бы это умеет, но я так понимаю GDB отлаживает только то, что получено с компилятора что и идёт в GCC. Всякие GoLand это умеют. Как?
>delve
Там кстати какой-то свой или перекомпиленный, ибо обычный, который отдельно ставится, не работает на 32 битных системах(не спрашивай, откуда я это знаю), а вот ГоЛанд нормально пашет на них же.
Этого я не знаю.
Можешь еще поинтересоваться, как отладка устроена в vscode, может найдешь полезную информацию.
Да я вообще мимо проходил, я не тот анон.
>kallax либо reform, либо sqlboiler
и ни одна из этих поебот не умеет нормально в many-to-many, охуительно
Что же делать? Горм плохо,
>kallax либо reform, либо sqlboiler
плохо, чистые sql-запросы плохо.
Да ладно, не верю. Это же не орм, это обёртки над sql, они не могут не уметь делать джоины.
>а мало того, что вместо join'ов делает select'ы и мерджит результаты на уровне приложения (а не базы)
мельком глчнул сорцы, вроде делает нормальный join
Ладно, я сделал. Надо было после порта в редиректе в настройках сайта добавить pattern из HandleFunc
Чувак, кажется, не совсем понимает, что такое m2m.
Могу обоссать любую поделку на го и переписать на кресты или старую добрую джаву
>Глубокого замысла в этом нет,
Если ты чего-то не знаешь, не значит, что этого нет.
Сложи (конкатенируй) два слайса от A до B и от B до C.
Зачем? На го ведь уже написано. Перепиши на го то, чего нет еще на го, а не трать время впустую.
Не мешай чуваку жить в его манямирке, где он единственный помнит про космическую радиацию.
>В го, к счастью, вырезали всю магию. Да, он простой до примитивизма. Да, многословный. Да, приходится иногда копипастить код. Да, в нём нет сахара.
Этого более чем достаточно,с большим запасом, чтобы не писать на этом уебищном подзалупинском языке.
Выкатываюсь из SAP в программирование. Есть фин. подушка на полгода-год (можно даже курс купить) и желание завести трактор через год-два-сто. Ну или фрилансить
НАсколько это реально? Почитал статей, обзоров-судя по всему вакансий ДОСТАТОЧНО, но не шибко много, как на джаве, пхп и прочем говне.
ПОнимаю, что вопрос очередного нюфани, но god bless вас, спасибо
api.secMut.Lock()
if len(api.SecretPool) == 0 {
api.secCond.Wait()
}
secret := api.SecretPool[0]
api.SecretPool = api.SecretPool[1:]
defer api.secMut.Unlock()
return secret, nil
зачем делать так и тратить такты у процессора?
for len(api.SecretPool) == 0 {
api.secCond.Wait()
}
Каталог /bin сгенерился, теперь билдит бинарники в него. Теперь другая проблема, не могу настроить чтобы бинарники видел в PATH, то есть чтобы запускать без указания каталога, например так home/go$ hello
>go install
Чтобы go install работал походу все исходники должны лежать в go/src/github.com/.../.../? Потому что если исходник в go/src/hello, то go install выдает ошибку.
>export PATH="$PATH:$GOPATH/bin" в .bashrc
Короче делал по инструкции, так export PATH=$PATH:$(go env GOPATH)/bin, выполнял source ~/.bash_profile, даже делал выход из системы, и все бестолку. Сейчас снова открыл .bash_profile а там оказывается опечатка. В общем заработало. Большое спасибо!
>должны лежать в go/src/github.com/.../.../
Никто ничего не должен и все прекрасно собирается из go/src/.../
>Никто ничего не должен и все прекрасно собирается из go/src/.../
Собирается, только бинарник кидает в каталог проекта, а не в go/bin.
Чё, неужели никто с sync.cond не работал?
return 'op huy'
}
opUsingGo, err := op.isUsingGo()
if err != nil {
return 'op huy'
}
if opUsingGo {
return 'op huy'
}
Было дело, это уже ~30 итерация треда, но я вырос и теперь сам пишу на го :((
Котлинтам вроде тоже зеленые треды осилили с асинками авэйтами
Или Го?
Прям аргументированно в пользу го?
Аппа не запустится в окружении без jvm, в каждом контейнере нужно jvm крутить, оверхед по оперативе.
Ну можно скомпилить в нейтив бинарник при желании.
А какой оверхед на оперативке? Там разве будет что-то больше +-1-2 мегабайт?
>Прочитал тут в руби треде, что го плох для веба
Ничем не плох. Кто слаще редьки не ел, конечно, будет топить за рельсу.
>похож на жабу
Да ты шутишь?! Инкапсуляция ниже плинтуса, все функции и глобальные переменные видны во всем пакете, типов доступа к атрибутам не существует (да хоть неявно, как в Питоне через __).
>перейдя с пыхи
Чому не Питон?
Друг посоветовал го, тк мне нужно было что-то быстрое быстрее пыхи; го формирует ответ в 2 раза быстрее
Тогда в путь.
Тут одинь мусье подогнал бенчмарк, по которому Го уделывается на обе лопатки в сервисе "принял rest запрос - сходил в postgre - создал html по шаблону - отправил ответ". Хотя Питон и ПэХэПэ там еще ниже.
Обычно эти тесты откровенно синтетические. Например предполагается, что запрос всегда корректный, запросы идут из локальной сети, с очень низкой латентностью и т.п. А другие платформы могут спокойно запускаться некорректно, в один поток, через какие-то сторонние оболочки, без специальных настроек и т.п.
Впрочем, если делать кастомные решения под какие-то задачи, то их часто можно сильно разогнать относительно универсальных, вне зависимости от языка. Универсальные под кастомные задачи тоже можно прилично разогнать, может быть не настолько сильно, но всё равно в разы.
>Обычно эти тесты откровенно синтетические.
Ты разбирался или ты очередное шаблонное трепло которое серит как стадо леммингов одно и тоже под копирку?
Го очень сильно уступает той же асинхронной джаве или расту и т.д., это его критический минус, с учетом что в котлине корутины завезли. Есть говно теперь не обязательно.
Берем котлин, берем вертекс (с котлин горутинами) и творим чудеса
Да и в котлине ты выбираешь тредпул где будет крутится у тебя корутины, в го... ох, впрочем не важно
>ты выбираешь тредпул
Уровня микроменеджмента. Решил поиграть в Господа Бога ака Планировщика Задач - повышай уж уровень процесса.
Го > Раст > Котлин
Нет, мне на го нужен был системный поток, куда я мог скинуть дробилки и я обосрался, точнее обосрался го конечно
же я сделал еще один высер в виде микросервиса и теперь у меня туча наносервисов
Несомненно удобно когда ты можеш контролить сей выпук но, конечно, не сам, а либы подтянув, которые за тебя написали
Ты же понимаешь, что отмазка вида "все равно все упрётся в ввод/вывод" уже не подходит. Настало время когда из кэша ты с молниеносной скоростью выплевываешь мелкие json'ы и тебе нужны эти 10к на твоем древнем сервере. А го как бы подпитывал надежды на крутую асинхронщину, а на деле jvm просто божит (особенно грааль и es4)
>А го как бы подпитывал надежды на крутую асинхронщину, а на деле jvm просто божит (особенно грааль и es4)
Можешь пояснить последнюю строку ньюфагу? Пожалуйста
У го осталось теперь только одно преимущество, это бинарь это зависимости и быстрый старт. Но если рынку нужен будет бинарь, там сделают или котлин-нейтив доделают к тому времени.
Меня и fat jar'ник устраивает тоже самое
Быстрый запуск? Ненужон мне как вебмакаке
try {} catch() {}
Что именно?
У джавы есть производительные асинхронные сервера, которые почти вровень с С++ и растом идут когда прогретые Все это есть и у котлина.
Так же, наблюдается качественный и быстрый jdbc драйвер к бд. Вообще библиотеки, популярные, зачастую качественные.
Что про грааль, так это какая-то йоба, которая на jvm и которая умеет парсить языки в йоба-дерево какое-то, за счет чего ускоряя.
Вот они и сделали для js какую-то йобу, которая по тестам божит и рвет лучше чем V8.
Почему и как - я не знаю и не до конца уверен в этом, но впечатляет.
За редким исключением каких-то там проверок котлин равен джаве, как уверяют нас дизайнеры языка.
В целом jvm (джава и котлин) быстрее го и удобнее. Это судя по тестам TechEmpower
Но тебе такие скорости могут и не пригодиться никогда, потому что быстрее упрешься в канал 100мбит.
Может показаться что я немножко ебнутый все время про скорость спрашивать, но моё апи парсит два json и выдает ответ, что занимало на пыхе ~3 секунды в особом случае ~3минуты, а на го 1.5секунды
Переписывать не надо, смысла в этом нет, просто дергай джаву из котлина.
Не понятно что там на пыхе парсится, для него json это многомерный массив.
Разовая операция по парсингу на джаве может быть дольше, потому что JIT сработает только после 10.000 обращений к методу
Вот тебе тесты по json
https://www.techempower.com/benchmarks/
Изучай и изучай исходник (какие либы они юзают).
Вероятно тебе нужен будет раст
Пасибо
Мне думается, обработка исключительных ситуаций постоянно, когда ты сначала мыслишь в рамках рабочего кода, а потом уже все "исключительное" - куда неприятнее избыточных записей.
Ну и сопровождать код, читая эти if err != nil, вообще вырвиглазно.
Чтобы и так не смеяться над тяжелой судьбой гоферов поднял тред на котлине (не мобильники)
>>1445837 (OP)
>>1445837 (OP)
>>1445837 (OP)
>>1445837 (OP)
>>1445837 (OP)
На го пишут микросервисы. Го, котлин, эликсир идут как вторичные, а не как первичные.
Заебали.
>На го пишут
Когда вы там писать успеваете, там же постоянно надо обрабатывать ошибку??
PS один раз соснул у суслика, по-моему в рендере, где просто возвращался err один, ну естественно я не подставил переменную и получил неявную заглушку на ошибку.
Прикинь, ты запускаешь, а у тебя тупо не работает и все. И ты такой - ЧЕГО МЛЯ??
Есть еще хуже вариант с работой SQL, где надо у кого-то несколько раз спросить - не произошла ли беда, то есть не у результата, что логично, а где-то просто так.
Если серьезно, то подобные вещи делают го не надежнее js и прочей динамико-дресни, где у тебя ничего не работает и не падает и ты дебагер часами мучаешь ах да, дебагер же тоже у вас там "ненужон" - это я помню
Да, пердачело мне ваш го в свое время знатно порвал.
Этот ваш суслик, тот еще анальный маньяк
Ну всё же бамп вопросу. Хотя бы скажите кто из вас вообще sync юзал?
или
В Kotlin с погружением в окружение Java.
Because c.L is not locked when Wait first resumes, the caller typically cannot assume that the condition is true when Wait returns. Instead, the caller should Wait in a loop:
https://github.com/rthornton128/goncurses
Вот это? Или есть лучше?
Не хочу использовать нативные tui типа termbox/tcell, меня интересует именно связка с ncurses.
Ты забыл принять таблетки, которые тебе врач выписал?
Я (уже другой анон, если что) видел исходники таких тестов на гитхабе и разбирался в них. Обычно автор фулл-тайм пишет на джаве или питоне и на всех языках пишет в итоге "как на джаве, только на го". Логично, если ты будешь писать оптимальный код на джавотлине и неоптимальный на го, то джавотлин будет быстрее.
Ну и да, в итоге во всех таких тестах победит блядский С, на котором ты будешь вычитывать поток сырых данных из сети и отдавать в ответ захардкоженный ответ, сразу же в виде байтов. Только к решению реальных задач это будет иметь примерно такое же отношение, как местные go-хейтеры к программированию.
Если авторы го-фреймов ссылаются на эти тесты, например автор fasthttp - значит они сами это и пишут
>видел исходники таких тестов на гитхабе
Тут ты просто сказочник, листал многие сорцы с целью посмотреть "как писать шустро" и наоборот в коде видны некоторые корректировки под тесты. Но они не критичны, там идет соревнования и все уже выжали что могли.
По идее там может быть максимум 2 итерации: первая неудачная когда кто опередил и вторая успешная.
Какие аргументы ldflags принимает? Где глянуть полный список с описаниями? В доках go help build не нашлось чота.
Например, в инете попадается go build -ldflags="-w"
Спс
https://play.golang.org/p/_V0cKHJvy9S
Пагни, а в чем мой косяк, почему поля не заполняются? Сам map и массивы внутри парсятся правильно, а элементы массива остаются пустыми. Где я проебался?
Отбой, сам разобрался. Нужно было имена полей начинать с заглавной буквы, чтоб они экспортировались.
Не совсем понял, что тебе надо? Автозапуск делается сторонними средствами, или тебе надо, чтобы просто всегда было твое приложение запущено
Ну типо чтобы мое апи работало, мне приходится заранее заходить через ssh и запускать его. И работать будет пока будет открыто это ssh соединение. Можно сделать чтобы оно работало постоянно?
Сначала у тебя исходники (файлы с исходным кодом), потом ты их компилируешь в бинарник (исполняемый файл).
Чувак, ты явно пришёл из мира php и тебе нужно много всего изучить.
Разница между пыхой и тем же го в том, что пхп-приложение - это набор исходников, которые тот же nginx с помощью специальной утилиты (обычно phpfpm) читает, интерпретирует и исполняет.
В случае с go, c, и целой кучей других стэков, само твоё приложение - и есть сервер, который сёрвит входящие запросы. Соответственно, во-первых, тебе далеко не всегда нужен nginx (но обычно нужен, потому что там есть куча всякой полезной фигни), во-вторых, тебе его нужно поднимать так же, как и nginx.
Это решается системой провизионинга.
Например:
- системный менеджер служб (init.d, systemd и прочие для линукс) - ты описываешь там юнит (путь, команду для старта, остановки, перезапуска, флаги, имя, необходимость рестартить при ребуте системы и т.п.) и просто запускаешь его через условный `sudo service start [my_application]`;
- сторонний менеджер-супервизор, какой-нибудь supervisord - ставишь, запускаешь, описываешь в конфиге путь для старта и прочее, затем говоришь `sudo supervisorctl start [my_application]` и то же самое;
- система контейнеризации, поначалу какой-нибудь docker (можно указать рестарт контейнера при перезагрузке и т.п.) - потом какой -нибудь nomad (он по-проще)/docker swarm/kubernetes/mesos.
Если ты совсем начинающий, используй supervisord, это до-докеровая классика в мире php-демонов, ты должен быть с ней +- знаком.
ох и завалил ты его , он использует сво говно как апи , а ты ему про демоны , тыб ему посоветовал бы что то типа forever c ноды , или уже на худой конец screen , но часть с докером верна
Ну да, давайте вместо системных служб или виртуализации использовать стороннее говно на ноде, зашибись идея.
А screen вообще для другого нужен, не путай тёплое с мягким.
И да, я уже упоминал "сторонний менеджер-супервизор, какой-нибудь supervisord" - это аналог того самого forever о котором ты говоришь.
Ну и крон каждую минуту (не чаще) будет поднимать тебе новый бинарник. А с уже запущенными ты что будешь делать?
Короче, не путай планировщик с супервизором, который отвечает за то, чтобы поднято было нужное количество демонов, они работали, были не подвисшими, перезапускает их по необходимости и много чего ещё. Это всё можно построить на кроне, но в итоге ты получишь тот самый супервизор, только кривой, потому что написан одним человеком на кроне и кастомных скриптах.
Я кручу докер контейнер docker-compose up -d с restart: unless-stopped, хз насколько это васянский подход, но мне хватает.
По идее норм. Сам думал так же сделать. Ты не сталкивался с какими-либо проблемами с таким подходом?
Нет, кручу так ботов в телеге несколько лет.
> Ну да, давайте вместо системных служб или виртуализации использовать стороннее говно на ноде, зашибись идея.
Двачую. Петушиные петухи с петушни.
Это копия, сохраненная 31 августа 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.