
Subbotin
25.06.2018
18:25:48
Вот у тебя есть
type A struct {
B []int
}
a = NewA()
как сделать вызов какогого-то кода при обращении к a.B?

undiabler
25.06.2018
18:26:24
рефлексия не серебрянная пуля и от всего не спасает, а иногда только оверхед дает здоровый
не нужно никаких извращений с неявным выполнением кода, юзайте геттеры и сеттеры и будет счастье

Subbotin
25.06.2018
18:27:35
ну вот orm на кодогенерации мог бы решить проблему

Crypt
25.06.2018
18:28:54

Google

undiabler
25.06.2018
18:29:18
это и есть геттер тогда =)
GetB()
или если очень хочется
GetParam("B")

Crypt
25.06.2018
18:29:53
Это как посмотреть) ну в целом да, динамический геттер

Subbotin
25.06.2018
18:31:45
Ну это нужна кодогенерация

undiabler
25.06.2018
18:33:03
а все эти неявные выполнения кода, использование unsafe и прочее, за такое нужно бить линеечкой по рукам)
потому что код становится не предсказуемым его трудно понимать и отлаживать, не то что внутри команды, а даже просто самому через месяц/два
в го как раз другой принцип, что напиши лапшу с кучей if else на каждую возможную ошибку, зато поймет даже школьник и такой код спокойно можно передать коллеге который вьедет и будет поддерживать без лишних плясок с бубном)
ну или покрывать тестами, но я еще не разу не встречал проекта где юзающийся orm покрыли бы тестами на предмет соответствия всем связям и т.д.
потому что с кодогенерацией это больно в основном

Roman
25.06.2018
20:29:31

Daniel
25.06.2018
20:35:53
Часто? Я вот пока ни разу

Pawel
25.06.2018
20:36:38

Roman
25.06.2018
20:48:20

Daniel
25.06.2018
20:49:22
Зачем они там?!

Roman
25.06.2018
20:50:12
ну или вот в тебя сыпятся ethernet-фреймы и надо понять что вообще это такое: есть ли там dotq, дотянуться до udp-заголовков
Зачем они там?!
интерфейс с ядром такой. можно посмотреть на af_packet из gopacket

Google

Daniel
25.06.2018
20:51:44
Но ансейф не обязателен же
Есть же легитимные методы

Roman
25.06.2018
20:52:04

Daniel
25.06.2018
20:52:55
binary.BigEndian и его родственники

Roman
25.06.2018
20:55:25
Вот смотри https://paste.ubuntu.com/p/WXtFMPMx3K/
у нас есть указатель на буфер где лежат данные + размер этого буфера. мы кастим в (*EtherHdr) и делаем switch по EtherHdr.EtherType
если там 0x8100 (vlan), то кастим в (*EtherVlanHdr)

Daniel
25.06.2018
21:00:20
Я дома гляну
На вскидку - можно парсить же, а не кастить
Ну и кастинг не работает с упакованными структурамт

Roman
25.06.2018
21:03:20

Daniel
25.06.2018
21:06:03
Да, но важно ли это?

Roman
25.06.2018
21:09:05

Daniel
25.06.2018
21:09:55
ну, в общем, да, в этом случае важно
но ты же пишешь совсем другое
ты пишешь "иногда не обойтись", а этот чат дети читают
так и пиши - "вам похер, но вот на моих pps не обойтись"

Roman
25.06.2018
21:12:07

Daniel
25.06.2018
21:13:28
он сказал "unsafe это нормально", а я всего лишь отреагировал "руки из под одеяла!"

Roman
25.06.2018
21:17:41

Google

Roman
25.06.2018
21:31:34
ну и cgo медленный, да =(

Daniel
25.06.2018
21:33:12
cgo я тоже не использую без нужды
последний раз - вместе с zmq, его другого просто нет

Roman
25.06.2018
21:34:52

Daniel
25.06.2018
21:35:30
А?!
Вот гигабит я утилизировал на zmq и парсинге без проблем.

Roman
25.06.2018
21:37:54

Daniel
25.06.2018
21:38:28
Это да, но ты первый начал

Anton
25.06.2018
22:20:26
Доброй ночи. Есть кто-нибудь знакомый с cgo?

Daniel
25.06.2018
22:20:56
насколько близко?
лучше сразу переходить к вопросам

Anton
25.06.2018
22:23:58
Ок. Выделяю память с помощью "C.alloc" (т.к. нужна неперещаемая переменная). Позже в совершенно другом месте программы при выполнении "обычной" инструкции "return []Control{c.label}" происходит перезапись памяти выделенной с помощью "C.alloc". По крайней мере вроде бы так говорит gdb.
Симптомы - SIGBUS (иногда другие SIGи), т.к. по C.alloc'овскому адресу храниться указатель на callback функцию

Pawel
26.06.2018
04:32:51

Daniel
26.06.2018
04:34:50

Pawel
26.06.2018
04:36:14
zeromq/gomq

Daniel
26.06.2018
04:37:20
он был с остальными сервисами не совместим у меня, к сожалению

German
26.06.2018
07:22:30
Всем доброго дня,
как красиво обработать данные вида {"foo1": {"foo2":{"foo3":{"data..."}}}}?
Нужно достать оттуда data и засунуть это всё в структуру

Stanislav
26.06.2018
07:33:19

Google

Виктор
26.06.2018
07:38:42
Тут вроде надо сделать json unmarshal и работать с полученной структурой. Есть встроенный пакет “encoding/json” для этого
Рефлексия совсем не про то. Вот статья о рефлексии, например https://m.habr.com/post/415171/

Pawel
26.06.2018
07:41:34

German
26.06.2018
07:43:48
Спасибо, буду разбираться

Александр
26.06.2018
08:17:20

Admin
ERROR: S client not available

Pawel
26.06.2018
08:18:25

many-faced
26.06.2018
08:24:56
Всем здравствуйте. Подскажите, пожалуйста, чем будет отличаться работа функций при следующих случаях?
func myTest1(done <-chan struct{}) {...}
func myTest2(done chan struct{}) {...}
Визуально, при
go myTest1(done) или go myTest2(done)
и затем done <- struct{}{}
Работает одинаково

Igor
26.06.2018
08:29:35

Ilya
26.06.2018
08:30:10
<-chan это read only, chan<- это write only

many-faced
26.06.2018
08:31:47
То есть это указывается тип канала. Вот меня и смутило то, что я могу передать в функцию канал, но его тип (read only, write only, rw) я не указываю до функции, то есть он таковым становится внутри.

Igor
26.06.2018
08:33:01

many-faced
26.06.2018
08:33:09
Верно.
Спасибо, ребята, разобрался.

Vyacheslav
26.06.2018
13:32:26
Подскажите плз, нет ли в go какой-нибудь возможности прямо указать какое-либо значение из нескольких возвращаемых? Например сейчас приходится делать так:
tmp, _ = json.Marshal(data)
json := string(tmp)
а хотелось бы так:
json := string(json.Marshal(data)) - но тут в string возникает затык, ибо он работает с одним параметром, а пришло два

The
26.06.2018
13:49:32
нету такой возможности
но прям в этом случае, вы можете не через json.Marshal() делать, а черед err := json.NewEncoder(buf).Encode(data), а затем у буффера вызвать buf.String(), хотя это практически одно и то же.
ошибочки нужно проверять

Aleksandr
26.06.2018
14:15:17
добрый вечер народ! подскажите плиз есть ли какая тулза чтобы мержить dep зависимости?

Google

Crypt
26.06.2018
14:50:28

Vyacheslav
26.06.2018
14:50:45

Alexander
26.06.2018
15:13:52
кстати, никто не в курсе на счет badger - что будет когда память закончится? он умрет? или начнет свапать на диск?

Roman
26.06.2018
15:14:27
а кто что использует для кодогенерации взамен дженериков? )

Kirill
26.06.2018
16:23:03
Может кто по очередям подсказать?
нужно что бы несколько хэндлеров обрабатывали задачи из редиса. если использовать пабсаб - то как одному хэндлеру дать знать другим - что он принял задачу в работу и больше никому ее не нужно трогать?
Или пабсаб тут не подойдет и нужно использовать что то другое?

undiabler
26.06.2018
16:27:40
ну используй одну горутину которая читает пабсаб и записывает все в канал
а остальные горутины уже конкурентно из этого канала вычитывают и работают

Kirill
26.06.2018
16:28:25
хэндлеры это отдельные приложения

The
26.06.2018
16:28:34
BRPOP/BLPOP
только это удаляет задачу из очереди. если что с неё не ок, её нужно опять пушить в список

Andrey
26.06.2018
16:30:51

undiabler
26.06.2018
16:31:12
я пытался такое на nsqd слепить
в одном канале приходят задачи, в другом канале хендлеры накидывают заявок на задачи. Поставивший задачу выбирает исполнителя и отписывает ему
в принципе пабсабом можно тоже самое реализовать

Kirill
26.06.2018
16:33:06

Andrey
26.06.2018
16:33:52
https://redis.io/topics/distlock
https://redislabs.com/ebook/part-2-core-concepts/chapter-6-application-components-in-redis/6-2-distributed-locking/6-2-5-locks-with-timeouts/

Kirill
26.06.2018
16:35:22

An
26.06.2018
17:15:21
Всем привет! Ищем Go разработчиков!
https://hh.ru/vacancy/26390229