
Kirill
20.12.2016
14:43:43
ну нафиг
я лучше упорюсь и сделаю многопоточность без блокировок
@tokenizer мне в помощь

Alexei
20.12.2016
14:44:45
сделай структуру данных, которая повторит ассоциативный массив и организуй в ней мьютексный доступ на уровне ключа

Google

Kirill
20.12.2016
14:45:00
не хочу
говорю же, я не хочу никаких блокировок
и в гошке не хотели, когда мой proposal развернули
но тогда я не знал, как сделать иначе
при evacuate(), который во время growWork
а вы знали, что код Go не проходит go vet?

Sergey
20.12.2016
14:58:46
атом?

Kirill
20.12.2016
14:58:52
конечно

Sergey
20.12.2016
14:59:07
у меня что-то не взлетел
vs code как-то приятнее, ИМХО

Kirill
20.12.2016
14:59:15
значит, что-то не так делал :)

Sergey
20.12.2016
14:59:39
ну, там сложно делать что-то не так

Google

Kirill
20.12.2016
14:59:50
довольно просто
плагины не те заюзать, например
надо будет свой список плагинов выложить

Alexei
20.12.2016
15:01:42
сегодня обновились плагины и у меня на трех линуксах отлетел GOPATH в атоме, зато он в настройке go-plus появился
мне больше всего сейчас атом для го нравится, да и для других яп, тоже, кроме джава-подобий

Kirill
20.12.2016
15:02:49
плюсую

Sergey
20.12.2016
16:02:13


Kirill
20.12.2016
16:05:23
во, кстати, да
покажи, вдруг действительно что-то у меня не то
Community Packages (51) /home/kirilldanshin/.atom/packages
├── atom-clock@0.0.8
├── atom-material-syntax@0.4.6
├── atom-material-syntax-dark@0.2.5
├── atom-material-syntax-light@0.4.5
├── atom-material-ui@1.3.6
├── autocomplete-go@1.3.0
├── bezier-curve-editor@0.7.2
├── build-elixir@0.6.0
├── chester-atom-syntax@0.1.1
├── color-picker@2.2.2
├── css-snippets@1.1.0
├── editor-background@1.2.27
├── editorconfig@2.0.4
├── environment@1.3.1
├── es6-javascript@1.0.0
├── file-icons@1.7.24
├── go-config@1.2.4
├── go-get@2.1.1
├── go-outline@0.6.1
├── gofmt@1.2.0
├── gometalinter-linter@1.2.2
├── gotests@0.2.5
├── improved-chester-atom-syntax@0.2.0
├── javascript-snippets@1.2.1
├── language-babel@2.48.5
├── language-elixir@0.16.0
├── language-hjson@0.3.0
├── language-quicktemplate@1.0.0
├── language-rust@0.4.8
├── language-svg@0.9.0
├── language-x86@1.0.1
├── language-x86-64-assembly@2.2.8
├── language-x86asm@0.8.0
├── linter@1.11.18
├── linter-csslint@1.3.3
├── linter-eslint@8.0.0
├── linter-flow@5.5.0
├── linter-golinter@1.2.1
├── linter-rust@0.7.0
├── linter-write-good@0.8.0
├── markdown-preview-plus@2.4.0
├── nord-atom-syntax@0.4.0
├── nord-atom-ui@0.9.0
├── qolor@0.4.0
├── steam-pirate-ui@0.6.1
├── svgo@2.6.0
├── term@0.2.4
├── terminal-plus@0.14.5
├── tidy-markdown@3.0.1
├── tokamak-terminal@0.1.2
└── vivid@1.1.8


Sergey
20.12.2016
16:10:16
но спасибо


Maxim
20.12.2016
16:30:16
Чёт внезапно решил заспидранить разработку новой библиотеки. С 0 до места в списке AwesomeGo: https://www.livecoding.tv/toby3d/

Andrey
20.12.2016
16:38:01
круто! имхо нужно стримов по программированию

Andrey
20.12.2016
16:40:45
+1 стрим по гошечки под пивко, лучший вечер :)

Sergey
20.12.2016
17:02:23
И тебе привет)

Quet
20.12.2016
17:11:56

Kirill
20.12.2016
17:12:38

Quet
20.12.2016
17:12:48
блокировки? )

Kirill
20.12.2016
17:13:21
ни в коем случае
это крайняя мера

Quet
20.12.2016
17:14:18
все равно ж этот “ряд изменений” сделает мап медленнее при однопоточном использовании

Google

Kirill
20.12.2016
17:14:28
мало того, их нужно будет немного ускорить

Quet
20.12.2016
17:14:54
бесплатный threadsafe? извините, но за все надо платить

Kirill
20.12.2016
17:15:13
платить будешь при многопоточном доступе к одному и тому же ключу

Subbotin
20.12.2016
17:15:38
А памятью платить не надо?

Quet
20.12.2016
17:15:51
ну вот значит как минимум тебе нужна проверка “к одному ключу или нет”, где-то хранить кто куда лезет и тд

Kirill
20.12.2016
17:16:08

Quet
20.12.2016
17:17:37
чет с трудом верится что авторы го не додумались как такое сделать ) они конечно может и не на острие computer science, но и не полные дебилы

Kirill
20.12.2016
17:18:11
конечно. тут просто совсем неочевидное решение.
сделаю — зацените
и статейку захерачу на хабр

Quet
20.12.2016
17:18:37
ну ок) будь морально готов что не прокатит

Alexei
20.12.2016
17:18:47
тут и постановка задачи узкоспециализированная, писать одним тредом в один ключ

Kirill
20.12.2016
17:19:44
я хочу сделать так уже универсально
а для этого уже ряд сложностей нужно решить

Quet
20.12.2016
17:20:20
ну блин… эти проверки ведь там не зря
и их туда сунули не потому что авторам просто захотелось )

Kirill
20.12.2016
17:20:51
конечно. я даже понял зачем именно.

Quet
20.12.2016
17:21:14
то что в твоем примере у тебя получился ок результат — ну повезло
сосед запустит и у него при перебалансировке мапа второй поток полезет куда-нибудь и все пиздой накроется

Google

Kirill
20.12.2016
17:22:00
конкретно этот код можно спокойно запустить на таких фиксах
а другой — да, улетит в пизду со скоростью света

Alexei
20.12.2016
17:22:34
я тут на работе тесты погонял, оно, конечно, дает небольшой выигрышь во времени, что-то около 400000-600000 наносекунд
на каждые 10 000 операций чтения/записи

Quet
20.12.2016
17:23:29
остальные промежуточные варианты это зло

Kirill
20.12.2016
17:24:01

Admin
ERROR: S client not available

Kirill
20.12.2016
17:25:26
но не буду же я релизить промежуточный вариант :)

Maxim
20.12.2016
19:25:07
С 500 мемберами вас
В честь этого - помогите глупому @toby3d решить проблему с подстановкой структур

corpix
20.12.2016
19:46:24

Maxim
20.12.2016
19:47:10
И ещё вопросец, есть такая структура:
type Response struct {
Ok bool `json:"ok"
Result ??? `json:"result"
}
Тип Result - динамический, на его месте подставляется одна из известных структур с данными. Мне юзать json.RawMessage для определения и подстановки?

corpix
20.12.2016
19:47:52
Да, json.RawMessage это наверное самое разумное решение такой задачи
Ещё можно написать Result interface{}. Всё зависит от того как ты хочешь работать с данными в случае Unmarshal в такую структуру

Kirill
20.12.2016
19:50:36

corpix
20.12.2016
19:50:57
Я не читал, аж 300 сообщений понафлудили

Maxim
20.12.2016
19:51:01

Kirill
20.12.2016
19:51:07

Google

Maxim
20.12.2016
19:51:49

Kirill
20.12.2016
19:52:35

corpix
20.12.2016
19:52:36
И стрим не смотрю сейчас. Я вообще за компьютером присутствую эпизодически %)

Maxim
20.12.2016
19:52:45

Kirill
20.12.2016
19:53:15
Нету ее
дык и у меня нет. но это же не значит, что это не лучше.

Maxim
20.12.2016
19:53:39
Короче, у меня есть 6 известных типов, которые подставляются под Result. Вот с этим я и застрял

corpix
20.12.2016
19:53:57
Лучше то что сам человек счёл для себя лучшим в конкретный момент времени, остальное - стереотипы ;)

Maxim
20.12.2016
19:58:45

Kirill
20.12.2016
19:59:05
или проще запихнуть все в одну структуру
#ачотакможнобыло

Maxim
20.12.2016
19:59:56
Пока так получилось:
fanc decodeResp(data []byte) (*Response, error) {
var apiResp Response
if err := json.Unmarshal(data, &apiResp); err != nil {
return nil, err
}
if !apiResp.Ok {
return nil, errors.New(apiResp.Error)
}
return &apiResp, nil


corpix
20.12.2016
20:03:52
Т.е. данные уже откуда-то получены и структура заполнена, например через Unmarshal, так?
Если использовать тип interface{} для поля Result то такую структуру можно маршалить в ответ. Если требуется получить тип Foo из Result то надо использовать не interface{}(потому что при Unmarshal сопоставить полученные данные с типом Foo будет невозможно), а json.RawMessage, при этом потребуется описать некоторую логику по определению типа, в который должен быть заанмаршален этот кусок JSON. У тебя в данных есть какое-нибудь поле, которое позволяет это сделать?

Maxim
20.12.2016
20:04:26
Но тогда в тестах и вообще приходится писать что-то типа: resp.Result.(Account).AccessToken

corpix
20.12.2016
20:05:33
Да, это не очень хорошо. Возможно стоит сделать отдельную структуру под каждый вариант ответа(например ответ на действие с Account)

Kirill
20.12.2016
20:05:44
лол