Oleg
Ну и правильный ответ : https://stackoverflow.com/questions/28718682/how-to-get-a-substring-from-a-string-of-runes-in-golang string([]rune(str)[:20])
Илья
https://github.com/gyuho/goraph
Илья
что-нибудь такое
Илья
может быть, там что-то есть
Anonymous
Мб ещё тут есть чего
Anonymous
https://github.com/emirpasic/gods
Vasiliy
всем привет
Aleksandr
всем привет
http://neprivet.ru/
Vasiliy
может кто подсказать как динамически создать массив кнопок из массива? пример такой есть https://github.com/go-telegram-bot-api/telegram-bot-api/wiki/Simple-Keyboard
Vasiliy
не могу заполнить массив рядами
Aleksandr
не могу заполнить массив рядами
ну так пройди тур https://tour.golang.org/welcome/1
Vasiliy
парсю сайт, получаю набор ссылок (список конференций), и из него надо сделать клавиатуру
Vasiliy
для бота
Vasiliy
ну так пройди тур https://tour.golang.org/welcome/1
стаж два года с гошечкой, не могу разобраться с ботом
Vasiliy
сам правда джавист
Vasiliy
в джавовском api проблем не возникло с этим вопросом
Aleksandr
стаж два года с гошечкой, не могу разобраться с ботом
проблема в чем конкретно? какой массив ты не можешь заполнить? по ссылке не вижу массива
Vasiliy
по ссылке пример, с захардкоженными кнопками
Vasiliy
мне надо создать их из массива
Vasiliy
туплю уже полчаса)
Aleksandr
slice передаешь так: ...rows или так rows...
Aleksandr
точно синтаксис не помню
Aleksandr
он распаковывается в variadic arguments или как там это на го называется..
Aleksandr
rows... - судя по коду этого же метода https://github.com/go-telegram-bot-api/telegram-bot-api/blob/master/helpers.go#L567
Vasiliy
можешь помочь с примером?
Aleksandr
я ссылку дал на метод с примером.
Aleksandr
слайс есть?
Oleg
var buttons := []tgbotapi.KeyboardButton { tgbotapi.NewKeyboardButton("abc"), tgbotapi.NewKeyboardButton("def"), } var row := tgbotapi.NewKeyboardButtonRow(buttons...)
Oleg
Три точки распаковывают слайс в variadic аргументы
Aleksandr
да
Vasiliy
var buttons := []tgbotapi.KeyboardButton { tgbotapi.NewKeyboardButton("abc"), tgbotapi.NewKeyboardButton("def"), } var row := tgbotapi.NewKeyboardButtonRow(buttons...)
а как теперь сделать массив рядов? чтобы это всё в клавиатуру запихать?
Aleksandr
два года опыта на go.
nikita
короче двумерный массив гугли
Илья
построить ряды с помощью NewKeyboardButtonRow
Brown
можешь помочь с примером?
countColumns := 5 countRows := 3 rowsKeybords = [][]KeyboardButton for numberRow := 1; numberRow < countRows; numberRow++{ columnsKeybord := []KeyboardButton for numberColumn := 1; numberColumn < countColumns; numberColumn++{ columnsKeybord = append(columnsKeybord, tgbotapi.NewKeyboardButton("Название кнопки"),) } rowsKeybords = append(rowsKeybords, columnsKeybord) } keyboard := tgbotapi.NewReplyKeyboard(rowsKeybords)
Brown
Примерно дальше сами
Brown
Не скомпиллируется
Brown
Но согласен со всеми вопрос очень странный, к go отношения особого не имеет, тривиальная задача
Vasiliy
два года опыта на go.
ничего смешного) опыт джава больше, и там проблем нет) а периодический свитч в гошечку проблемно даётся
Aleksandr
ничего смешного) опыт джава больше, и там проблем нет) а периодический свитч в гошечку проблемно даётся
да нет, смешно, потому что это был ответ на предложение пройти тур. два года опыта - это сеньор. если слайсы не можем составлять - это неделя опыта.
Vasiliy
всё оказалось проще msg := tgbotapi.NewMessage(int64(id), "List") var keyboard [][]tgbotapi.KeyboardButton for _, c := range Confs { keyboard = append(keyboard, tgbotapi.NewKeyboardButtonRow(tgbotapi.NewKeyboardButton(c.name))) } markup := tgbotapi.ReplyKeyboardMarkup{ ResizeKeyboard: true, Keyboard: keyboard, } msg.ReplyMarkup = markup bot.Send(msg)
Vasiliy
не заметил что там уже массив кнопок
Slava
Как думаете, можно ли, в двух разных горутинах, в одной заменяем значение ссылки в поле структуры, к примеру struct bla { field1 *BlaType} а в другой читаем это поле, и свежесть данных не важна?
Mike
хотите узнать, в чем ебала была?
Mike
https://github.com/golang/go/issues/16079
Mike
вот у меня такой же трейс как у того чувака
Oleg
https://godoc.org/sync/atomic Раз есть такой пакет, наверное нельзя :)
Mike
В ТОМ ЧТО ХЭШМАПА КОТОРУЮ Я ДЛЯ ОЧЕРЕДИ ИСПОЛЬЗОВАЛ НЕ ТРЭД СЕЙФ И ЭТО И ПАДАЛО С ТЕМ ТРЕЙСОМ
Mike
но почему он ориджинейтился в транспорте и хттп клиенте ояебу
Slava
sync/atomic нужен для синхронизации, в моём примере не важно, старые ли там данные или новые
Slava
потому что вопрос был не в том, что использовать
Vladislav
И что у тебя там будет на старте? Не выйдет, что там нулевые данные пока 1 поток не обновит их?
Slava
не важно, null там или нет
Vladislav
Ну если тебе вообще неважно на целостность данных, то можешь так делать. Но если там есть чему ломаться, то оно сломается.
Slava
что сломается?
Slava
вот пример к задаче https://play.golang.org/p/J6-rgK8S8J
Vladislav
Ну так оно работать не будет.
Vladislav
Замыкания так не работают.
Slava
почему не будет?
Slava
почему замыкания так не работают?
engelbart
а где gogo3
Slava
свежесть данных не важна, я писал выше
Slava
если они схлопываются - тоже всё равно
engelbart
да чорт с ней с свежестью, я чото не пойму пока куда деваются. таймер же типа одинаков.
engelbart
ну т.е. понятно что псевдопотоки и прочее, но почему так точно, только чётные
Slava
Замыкания так не работают.
что не так с замыканиями?
Mike
замыкания копируют все что нужно в себя
Mike
так что если хочешь джона менять, сделай его указателем
Mike
а ну у тебя внутри поле указатель
Mike
ок
Slava
даже если не указатель, то какая разница? =)
Мерль
http://golangshow.com/episode/2017/05-31-102/
Мерль
#подкаст
Slava
а ну у тебя внутри поле указатель
https://play.golang.org/p/81QQU2WumO и без указателя работает
Mike
ну ок