
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

John
09.02.2018
15:53:27
Всем привет! Хочу представить путь внутри json в виде объектов. То есть если у меня есть объект приведенный ниже, то путь до двойки в js будет выглядеть как “a[0].b”.
{
a: [
{ b: 2 }
],
}
Я хочу представить в виде слайса объектов двух типов PathKey и PathIndex, так как по спецификации json ключ - это строковое значение, а index - число.
У структур PathKey и PathIndex по одному полю и нету методов. Подскажите как я могу построить интерфейс вокруг них, так как хотелось бы в функциях работать с интерфейсом PathElement, но так как нету мотодов, то не могу их связать, а выставлять наружу пустой интерфейс тоже не хочется.
Внутри в любом случае буду использовать switch по типу, вопрос только в контракте.
Странное желание, ну да ладно. Я бы сделал что-то типа такого: r := NewReaderFromJson(); number := r.Array(0).Number() Думаю мысль понятна
если Я вообще правильно понял, что нужно :)


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
у меня дебаг жетбрэинса не всегда корректно отрабатывает, мб поэтому, или по рантайму неправильно?

Aleksandr
09.02.2018
15:57:39


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
Подскажите что можно исправить или доработать.

Mykyta
09.02.2018
16:22:51

Google

Vladimir
09.02.2018
16:23:21
я тоже не понимаю зачем эта штука нужна. И еще меня как потенциального пользователя очень сильно раздрожает что нужно руками сделать wg и делать Done
https://github.com/Chebyrash/promise/blob/master/promise.go#L80 - аточно тут нужен busy wait?

Mykyta
09.02.2018
16:23:44

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

Aleksandr
09.02.2018
16:30:46

Атас
09.02.2018
16:36:37

Aleksandr
09.02.2018
16:37:50
до этого метод выглядел так:
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
а []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

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:03:26
Мьютексы в ботах нужны в редких случаях. Каков контекст?

Marlik
09.02.2018
18:10:49

Dmitri
09.02.2018
18:11:09

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

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

Maxim
09.02.2018
18:17:14
Все обновления идут одним сплошным потоком

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

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

Marlik
09.02.2018
18:20:46