Kirill
Звучит отвратительно
пока рано говорить о том, как это будет
Nik
ты пробовал гуглить вообще?
не поверишь. и из стандартного - проверка есть толкьо при чтении из канала. при записи в закрытый - всегда паника и разруливать через рековер
Kirill
ну - гляди. ладно, ща подскажу.
Nik
суть песни - забродкастить один http запрос в 5 бекендов, и взять ответ от того, кто первый ответит.
Nik
https://play.golang.org/p/eNiJrklDh2Q
Kirill
https://play.golang.org/p/1vqsgeE25tE работает на amd64
Kirill
это еще красивый способ
Kirill
главное - не удаляй анонимные поля перед closed
Kirill
а то проверять будешь по части значения длины данных в очереди
Nik
понял
Nik
спасибо
Kirill
пойду-ка запихну в либу эту дичь
Nik
не уверен что это тредсейф, но попробую
Nazar
мб мне повезет, признак вейерштрасса никто не может кинуть доказательство?)0) или книжечку
Kirill
не уверен что это тредсейф, но попробую
но это гарантированно не вычитает данные
Kirill
ты, конечно, можешь попробовать вытащить ссылку на сам .closed и сделать atomic.LoadUint32()
Nik
тред а читает данные и закрывает канал полчив их| тред б проверяет что канал не закрыт и пишет в него. А после проверки он успел закрыться. Наверно надо делать запись с проверкой на закрытость
Kirill
технически, запись в некоторых случаях является прямой передачей значения ресиверу, обходя буфер канала
Kirill
так что под вопросом, сможешь ли ты проверить и сразу записать что-то
Daniel
коллега. нахера в ыпоказываете эти картинки детям?
Daniel
чтобы что?
Kirill
какой вопрос - такой ответ. без вычитывания из канала и без defer recover() (благо под коробкой не throw()) я знаю разве что этот вариант
Daniel
а хорошо бы не знать ни одного, и обойтись без проверок на закрытость
Kirill
не знать я уж давно не могу, так или иначе
Kirill
иногда уже вообще не ясно, где начинаются картинки, которые показывать не надо
Daniel
там, где unsafe - уже точно они
Kirill
если детям не показывать такое, в итоге дойдут сами, еще и до некорректных вариантов типа closedAddr := unsafe.Pointer(uintptr(unsafe.Pointer(&c)) + uintptr(unsafe.Offsetof((hchan{}).closed))) return atomic.LoadUint32((*uint32)(closedAddr)) > 0
Kirill
даже на стековерфлоу, дожили, говнокодят с одновременно (!) использованием unsafe и reflect: https://stackoverflow.com/a/38836546
Kirill
А когда это он был/стал показателем хороших практик?)
он всегда был показателем того, до чего доползли так называемые "дети"
Kirill
разбанил, но банхаммер на готове, так что без спама впредь
Kirill
и сутки ты в рестрикте - не сможешь в стикеры и гифки. я видел, какое полотно стикеров было удалено.
Kirill
Кратко о том, как выглядит программирование на го со стороны
Daniel
А как проверить, закрыт канал или нет перед записью в него, не читая из него ничего?
никак. стройте свое приложение так, чтобы такая проверка вам не требовалась
Nik
никак. стройте свое приложение так, чтобы такая проверка вам не требовалась
Кейс. Запускаю пять работ, все дают результат. Мне нужно подучить один результат, остальные работы сжечь и не ждать их завершения
Daniel
ну
Daniel
при чем тут проверка закрытия перед записью
Nik
Сделал канал до начала работ. Кто первая отработала - положила результат в этот канал. После работ читаю из канала.
Nik
И вопрос - как остальные работы прервать
Daniel
перрвать есть классическая техника - передаете туда канал, внутри из него читатете в селекте. как только вы этот канал закроете - из него везде, наконец, что-то прочтется, и это будет означать, что пора закрываться
Nik
https://play.golang.org/p/eNiJrklDh2Q
Daniel
https://play.golang.org/p/eNiJrklDh2Q
prog.go:30:1: syntax error: unexpected EOF, expecting }
Nik
Весь код на плейграунд не влезет
Daniel
ну вот именно эту горутину у вас прервать не выйдет - в ней нет ничего для прерывания
Vladimir
https://play.golang.org/p/eNiJrklDh2Q
https://play.golang.org/p/CShKusmIV7Q можешь так сделать например
Vladimir
@elvis_live в целом можно и без контекста, сделать канал синхронизации какой-нибудь и при его закрытии прерывать работу (также если ты в цикле тока работает)
Nik
@elvis_live в целом можно и без контекста, сделать канал синхронизации какой-нибудь и при его закрытии прерывать работу (также если ты в цикле тока работает)
Ну так же склеритами будет, но контекст мне больше люб. И вроде его можно пропихнуть в http клиента и прервать запрос
Nik
(Че я сразу то не подумал)
Daniel
(Че я сразу то не подумал)
я думаю - просто не думал вообще
Kirill
я думаю - просто не думал вообще
Почему я всё ещё полагаю, что люди сначала думают, перед тем, как делают?
Kirill
https://dave.cheney.net/2018/05/29/how-the-go-runtime-implements-maps-efficiently-without-generics
Антон
Зачем сюда жгучий перец, в го и так предостаточно причин для слёз
Michail
скажите можно делать glide install <МОЯ_ПАПКА> а не в /vendor ?
Kirill
нет
Kirill
более того - зачем?
Anton
коллеги, вопрос (возможно болезненный, но что-то не нашел здесь обсуждения) имеем sqlx и всячески избегаем ORM и для примера, пусть будет: type User struct { ID int64 `db:"id"` Name string `db:"name"` Group *Group `db:"Group"` } type Group struct { ID int64 `db:"id"` Name string `db:"name"` } вытаскиваем пользователей и left join на группы, и естественно присутствуют пользователи без групп. кто какие варианты использует, для случая, когда Select сразу в &user? дефолтное поведение - ругнется Scan error, из-за того что не смог nil в int64
Wingman
int64 -> sql.NullInt64 ?
Ne Vlad
Указатель на int64
Wingman
или да
Anton
то есть других способов за последнее время не выработалось?
Kirill
нет, конечно
Kirill
nullable типы как представлялись, так и представляются, как ссылочные
Wingman
только ссылки потом умучаешься сейвить обратно в БД null`ами
Wingman
проще sql.Null`Type
Anton
sqlboiler тащить не хочется пойду наверное напишу генератор, для всего этого бойлерплейта
Wingman
можно разово https://github.com/xo/xo нагенерить и дальше править под себя
Anton
и помимо сейва в бд, где естественно ненулабл id, есть боль с маппингом в структуры улетающие через rest api
Anton
можно разово https://github.com/xo/xo нагенерить и дальше править под себя
угу, как раз он за основу и был взят и немного подправлен под себя.. пойду еще подпилю немного. пасиб!