Nik
ты пробовал гуглить вообще?
не поверишь. и из стандартного - проверка есть толкьо при чтении из канала. при записи в закрытый - всегда паника и разруливать через рековер
Kirill
ну - гляди. ладно, ща подскажу.
Nik
суть песни - забродкастить один http запрос в 5 бекендов, и взять ответ от того, кто первый ответит.
Nik
https://play.golang.org/p/eNiJrklDh2Q
Kirill
https://play.golang.org/p/1vqsgeE25tE работает на amd64
Nik
Kirill
это еще красивый способ
Kirill
главное - не удаляй анонимные поля перед closed
Kirill
а то проверять будешь по части значения длины данных в очереди
Nik
понял
Nik
спасибо
Kirill
пойду-ка запихну в либу эту дичь
Nik
не уверен что это тредсейф, но попробую
Nazar
мб мне повезет, признак вейерштрасса никто не может кинуть доказательство?)0) или книжечку
Kirill
Kirill
ты, конечно, можешь попробовать вытащить ссылку на сам .closed и сделать atomic.LoadUint32()
Nik
тред а читает данные и закрывает канал полчив их| тред б проверяет что канал не закрыт и пишет в него. А после проверки он успел закрыться. Наверно надо делать запись с проверкой на закрытость
Kirill
технически, запись в некоторых случаях является прямой передачей значения ресиверу, обходя буфер канала
Kirill
так что под вопросом, сможешь ли ты проверить и сразу записать что-то
Daniel
Nik
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
Alexey
Kirill
разбанил, но банхаммер на готове, так что без спама впредь
Anton
Kirill
и сутки ты в рестрикте - не сможешь в стикеры и гифки. я видел, какое полотно стикеров было удалено.
Kirill
Kirill
Кратко о том, как выглядит программирование на го со стороны
Dmitry
Daniel
Daniel
ну
Daniel
при чем тут проверка закрытия перед записью
Nik
Сделал канал до начала работ. Кто первая отработала - положила результат в этот канал. После работ читаю из канала.
Nik
И вопрос - как остальные работы прервать
Daniel
перрвать есть классическая техника - передаете туда канал, внутри из него читатете в селекте.
как только вы этот канал закроете - из него везде, наконец, что-то прочтется, и это будет означать, что пора закрываться
Nik
https://play.golang.org/p/eNiJrklDh2Q
Nik
Nik
Весь код на плейграунд не влезет
Daniel
ну вот именно эту горутину у вас прервать не выйдет - в ней нет ничего для прерывания
Nik
Vladimir
@elvis_live в целом можно и без контекста, сделать канал синхронизации какой-нибудь и при его закрытии прерывать работу (также если ты в цикле тока работает)
Nik
Nik
(Че я сразу то не подумал)
Vladimir
Kirill
https://dave.cheney.net/2018/05/29/how-the-go-runtime-implements-maps-efficiently-without-generics
Антон
Зачем сюда жгучий перец, в го и так предостаточно причин для слёз
Chebyrash
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
Anton
sqlboiler тащить не хочется
пойду наверное напишу генератор, для всего этого бойлерплейта
Wingman
можно разово https://github.com/xo/xo нагенерить и дальше править под себя
Anton
и помимо сейва в бд, где естественно ненулабл id, есть боль с маппингом в структуры улетающие через rest api