@proGO

Страница 1214 из 1674
Alexander
09.02.2018
10:43:24
Так как там не только значение сравнивается

Атас
09.02.2018
10:49:40
угу и типы, и размеры, и идентичность значений по ключам и нырок в значения, правда не увидел прямой проверки типа ключей, но смотрем мельком код

Aleksey
09.02.2018
15:45:18
Чятик, подскажите, есть ли либо для работы bt кроссплатформенные (можно без винды)?

Aleksey
09.02.2018
15:50:38
Всем привет! Хочу представить путь внутри json в виде объектов. То есть если у меня есть объект приведенный ниже, то путь до двойки в js будет выглядеть как “a[0].b”. { a: [ { b: 2 } ], } Я хочу представить в виде слайса объектов двух типов PathKey и PathIndex, так как по спецификации json ключ - это строковое значение, а index - число. У структур PathKey и PathIndex по одному полю и нету методов. Подскажите как я могу построить интерфейс вокруг них, так как хотелось бы в функциях работать с интерфейсом PathElement, но так как нету мотодов, то не могу их связать, а выставлять наружу пустой интерфейс тоже не хочется. Внутри в любом случае буду использовать switch по типу, вопрос только в контракте.

Google
Aleksandr
09.02.2018
15:55:17




коллеги, что я упускаю? почему после второй операции buf.next = buf.tokenizer.NextToken() у меня меняется buf.current.value

сорри за картинки.

prev lexer.Token next lexer.Token current lexer.Token

Aleksandr
09.02.2018
15:57:12
у меня дебаг жетбрэинса не всегда корректно отрабатывает, мб поэтому, или по рантайму неправильно?

Aleksey
09.02.2018
16:09:05
если Я вообще правильно понял, что нужно :)
type PathElement interface{} type PathKey struct { key string } type PathIndex struct { index int } func PathToString(path []PathElement) string { var result string for _, pathElement := range path { switch pathElement.(type) { case PathKey: pk := pathElement.(PathKey) result += "." + pk.key case PathIndex: pi := pathElement.(PathIndex) result += "[" + strconv.Itoa(pi.index) + "]" } } return result } Пример синтетический, чтобы объяснить какого результата хочу - мне нужно, чтобы PathToString принимал только PathIndex или PathKey. При этом у обоих нет методов. Единственный вариант - создать метод-заглушку.

Вообще насколько такое решение противоестественно: type PathElement interface { path() } type PathKey struct { key string } func (p PathKey) path() {} type PathIndex struct { index int } func (p PathIndex) path() {}

xPushkin
09.02.2018
16:20:27
Друзья, первый раз попробовал написать свой пакет - https://github.com/Chebyrash/promise Подскажите что можно исправить или доработать.

Google
Vladimir
09.02.2018
16:23:21
я тоже не понимаю зачем эта штука нужна. И еще меня как потенциального пользователя очень сильно раздрожает что нужно руками сделать wg и делать Done

https://github.com/Chebyrash/promise/blob/master/promise.go#L80 - аточно тут нужен busy wait?

Vladimir
09.02.2018
16:23:56
к тому же вообще не стоит так делать

append в слайсы помоему не атомарен

Mykyta
09.02.2018
16:24:07
Да, кстати

Vladimir
09.02.2018
16:24:16
делая его в другой горутине ты скорее всего получишь неведомую фигню

и еще читая из слайса пока в него аппендят

xPushkin
09.02.2018
16:24:44
Хм, тогда как лучше исправить?

Mykyta
09.02.2018
16:24:59
Хм, тогда как лучше исправить?
Использовать каналы для ожидания

Vladimir
09.02.2018
16:25:01
@Chebyrash есть варианты - например передавать все через каналы

второй вариант блокироваться через канал

Mykyta
09.02.2018
16:25:08
Хм, тогда как лучше исправить?
и синхронизировать мютексами

Vladimir
09.02.2018
16:25:19
третий вариант - мьютекс вокруг слайса и канал говорящий "есть данные" )

xPushkin
09.02.2018
16:25:41
Понял, спасибо большое ?

Vladimir
09.02.2018
16:26:11
также как и стейт

= - не атомарная вещь

можешь огрести

точнее не так - точно огребешь

ну плюс на Го с callback'ами код делать - meh

Google
Vladimir
09.02.2018
16:27:30
но это в целом про смысл библиотеки скорее

Атас
09.02.2018
16:27:31
коллеги, что я упускаю? почему после второй операции buf.next = buf.tokenizer.NextToken() у меня меняется buf.current.value
а меняется на что ? по коду должен на предудущее значение next, а не деле ? и тип TokenizerBuffer и включенные в него посмортеть не плохо бы

Aleksandr
09.02.2018
16:30:46
а меняется на что ? по коду должен на предудущее значение next, а не деле ? и тип TokenizerBuffer и включенные в него посмортеть не плохо бы
на скринах видно. во время присвоения next, current.value меняется на другие байты. TokenizerBuffer я показал на скрине. там три поля типа lexer.Token плюс tokenizer, откуда выгребаю токены

Aleksandr
09.02.2018
16:37:50
покажи тогда lexer.Token и код NextToken()
на скрине все данные привел) но ок, еще раз: func (lexer *lexer) NextToken() Token { return <-lexer.tokens } type Token struct { typ tokenType value []byte }

до этого метод выглядел так: func (lexer *lexer) NextToken() Token { tok := <-lexer.tokens return tok }

и уже после первой строчки current менялся. то есть что-то с каналом связано

в канал отправляю тупо так: func (lexer *lexer) emit(token Token) { lexer.tokens <- token }

tokens: make(chan Token),

мыслей зиро

Атас
09.02.2018
16:47:49
скорее не с самим каналом, а тем что в канал отдаются не значения, а ссылки и в процесе работы данные перебиваются Token не ссылочный тип ?

Aleksandr
09.02.2018
16:48:14
именно что нет

Aleksandr
09.02.2018
16:49:13
и если бы ссылочный был, то были бы какие то предыдущие данные. но меняется на совершенно другие

Атас
09.02.2018
16:51:22
меняется иммено на произвольные ? или на данные которые дальше в текенизере могут быть ?

Aleksandr
09.02.2018
16:54:31
во, я понял на что меняется. меняется частично на следующий токен. current токен - это 1985, следующий - дефис, и 1985 становится 0485, где 04 - это следующий после дефиса токен.

понятна природа, но не понятна суть.

Атас
09.02.2018
16:55:21
value у тебя в любом случае ссылочный, попробуй вместо присвоения copy() использовать только размеры проконтралируй

а поле type у небя не плывет ? если нет, то дело точно в слайсе byte

Aleksandr
09.02.2018
17:00:40
а поле type у небя не плывет ? если нет, то дело точно в слайсе byte
возможно плывет, но оно одинаковое, так что не отследить.

а []byte я вот так заполняю: lexer.emit(DigitToken(lexer.context.buffer.Bytes()[:])) lexer.context.buffer.Reset() не понимаю почему должно по ссылке передаваться

Google
Атас
09.02.2018
17:05:01
покажи еще DigitToken

Aleksandr
09.02.2018
17:05:21
func DigitToken(value []byte) Token { return Token{TOKEN_DIGIT, value} }

Атас
09.02.2018
17:10:18
так value у тебя ссылочный тип ты всегда ссылки передаешь, а byte.buffer еще та вещь, там есть забавности, не давно кто-то попадал в группе

попробуй так: func DigitToken(value []byte) Token { tmp:=make([]byte,len(value)) copy(tmp,value) return Token{TOKEN_DIGIT, tmp} }

Admin
ERROR: S client not available

Aleksandr
09.02.2018
17:11:48
прости, надо бежать. позже проверю и отпишусь. Спасибо

Атас
09.02.2018
17:12:45
я там ошибся, поправил

Aleksandr
09.02.2018
17:24:59
Или нет. Ладно, позже проверю.

Атас
09.02.2018
17:27:12
а []byte я вот так заполняю: lexer.emit(DigitToken(lexer.context.buffer.Bytes()[:])) lexer.context.buffer.Reset() не понимаю почему должно по ссылке передаваться
вобщем у тебя трабла из-за buffer.Bytes() https://golang.org/pkg/bytes/#Buffer.Bytes так как каналы, то и горутины успевают почитать пописать...

Aleksandr
09.02.2018
17:27:51
Кстати да. Вот это вероятный кейс

Атас
09.02.2018
17:40:14
скорее всего дело где-то в этом, можно попробовать вместо lexer.emit(DigitToken(lexer.context.buffer.Bytes()[:])) lexer.context.buffer.Reset() сделать tmp:=make([]byte,lexer.context.buffer.Len()) copy(tmp,lexer.context.buffer.Bytes()) lexer.emit(DigitToken(tmp)) lexer.context.buffer.Reset() не меняя DigitToken() даже наверно луче, меньше шансов что Buffer поменяеться в процессе

Dmitri
09.02.2018
17:52:58


Marlik
09.02.2018
17:55:27
Тут ты слайс заносишь в структуру, от 0 до окончания массива.

Dmitri
09.02.2018
17:55:49
Ну судя по докам да

Спасибо

Marlik
09.02.2018
17:56:19
Ну посмотри, я хз.

Не за что.

Ботоводы, кто юзает gopkg.in/telegram-bot-api.v4, как с базой работаете? Я вот структурку сделал и работаю через неё. Но возникла мысль, что эту структурку будут юзать из разных горутин. И вот думаю, либо мьютекс делать или какой-то ещё способ есть работать с базой?

Google
Maxim
09.02.2018
18:11:12
В смысле контекст?
Для чего база? Что в ней?

Marlik
09.02.2018
18:12:28
type DATA struct { ID int `db:"ID"` ChatID int64 `db:"ChatID"` HashForPay int `db:"HashForPay"` Balance int `db:"Balance"` MessageID int `db:"MessageID"` StateWhat string `db:"StateWhat"` PathWhere string `db:"PathWhere"` DateTime *time.Time `db:"DateTime"` } Простенько, состояние сохранить, путь да баланс.

Sqlite юзаю.

Maxim
09.02.2018
18:14:52
type DATA struct { ID int `db:"ID"` ChatID int64 `db:"ChatID"` HashForPay int `db:"HashForPay"` Balance int `db:"Balance"` MessageID int `db:"MessageID"` StateWhat string `db:"StateWhat"` PathWhere string `db:"PathWhere"` DateTime *time.Time `db:"DateTime"` } Простенько, состояние сохранить, путь да баланс.
Если информация персональная (инфа одного юзера не меняется от лица другого) то мьютексы и не нужны, скорее всего. Транзакции разве что.

Marlik
09.02.2018
18:16:34
Там просто такая конструкция в либе go http.ListenAndServe(conf.ListenLocal, nil) И я так понимаю, что несколько юзеров, несколько горутин. Я правильно понимаю-то?

Marlik
09.02.2018
18:18:35
Эт понятно, но как это будет выглядеть, чот не вкуриваю, для каждого юзера горутина?

Maxim
09.02.2018
18:18:47
В обычном режиме горутина только одна, которая постоянно в фоне стучит за обновлениями самостоятельно

Страница 1214 из 1674