Мерль
GetStream/vg: Virtualgo: A dep compatible solution to problems caused by the vendor directory https://github.com/getstream/vg
Aleksand
а кто-нибудь в курсе есть ли в стандартной библиотеке (net/http) нормальные возможности для записи множества заголовков с одним именем? Если Set-Cookie разруливается отдельно, то для заложенных в RFC возможностей вроде Cache-Control: no-cache, no-storeкоторый эквивалентен Cache-Control: no-cache Cache-Control: no-storeкак быть уже непонятно совсем
Aleksandr
насколько помню два раза добавив хэдер с разным значением такой результат и получишь
Aleksand
Aleksandr
ну так все правильно
Aleksandr
мап слайсов
Aleksandr
// Add adds the key, value pair to the header. // It appends to any existing values associated with key. func (h Header) Add(key, value string) { textproto.MIMEHeader(h).Add(key, value) }
Dmitriy / დიმიტრი
Есть объект с RWMutex'ом и двумя методами Read(key string) (err error, value int) и Write(key string, val int) (err error). Какой можно написать unit-тест что бы проверить, что код потокобезопасный? Сначала думал создать 10 горутин и запустить в них цикл со счетчиком до 100, где каждая горутина бы получала доступ к одному и тому же ключу и приплюсовывала 1, тогда если бы по окончанию работы на Read выводилось значение 1000, то тест был пройден. Но тут мьютекс внутри и замыкается/размыкается внутри методов и так не получится сделать
Slava
Запускай тест с ключом -race
Slava
Тест что ты описываешь выше - не верный, так как он предполагает атомарность на группу вызовов (read/write)
Vasiliy
@m0sth8 привет! можно вопрос - как реализовать тексттовое меню, только с подъёмом вверх по иерархии? что можешь посоветовать?
Vasiliy
@m0sth8 я это, один и подслушателей голанг шоу)
Vasiliy
респект за подкаст
Dmitriy / დიმიტრი
Я вот и не знаю какой тест ещё придумать
Наверное уже есть какие-то общие для всех языков способы протестировать такой код
Anton
респект за подкаст
а что за подкаст? для тех кто не в теме..
Vasiliy
http://golangshow.com
Anton
Slava
Я вот и не знаю какой тест ещё придумать
тест с -race поломается, если доступ к полю у тебя будет не защищён. Но защита поля на запись и чтения не значит что тебе не надо защищать более сложные операции
Slava
можешь рассказать более подробно, что ты пытаешься протестировать?
Slava
да, иначе не понять, может у тебя структура только внутри одной горутины всегда работает
Dmitriy / დიმიტრი
да, иначе не понять, может у тебя структура только внутри одной горутины всегда работает
то есть впринципе мне хватит теста который запустит 100 горутин в которых будут выполняться случайные операции записи/чтения? Я хотел еще в конце теста дожидаться окончания всех горутин и сравнивать результат с ожидаемым.
Vladimir
На как раз пачку горутин которые параллельно что то делают
Vladimir
https://golang.org/doc/articles/race_detector.html
Dmitriy / დიმიტრი
окей. поставлю вопрос по другому. Допустим нет -race, как мне проверить что логика не нарушилась?
Vladimir
Как это нету?
Сережа
никак, тесты могут показать наличие ошибок, а не их отсутствие
Slava
если у тебя не compare and swap, то ты не можешь инкрементить без лока на всю структуру на несколько операций
Slava
нет
Slava
рейс видит, что ты атомарно читаешь и атомарно пишешь
Michael
как закончите, по результатам оформите статью?
Slava
но он не видит, что ты хочешь атомарно прочитать и записать в одной транзакции
Dmitriy / დიმიტრი
но он не видит, что ты хочешь атомарно прочитать и записать в одной транзакции
Тогда наверное вопрос как проверить, что операции точно являются атомарными?
Vladimir
но он не видит, что ты хочешь атомарно прочитать и записать в одной транзакции
Он не видит что ты хочешь, но при этом если без лока и атомиков сделаешь параллельные вещи даст по рукам
Dmitriy / დიმიტრი
Что-то я короче загоняюсь
Vladimir
И используешь его
Slava
Он не видит что ты хочешь, но при этом если без лока и атомиков сделаешь параллельные вещи даст по рукам
наверное мы про разное, у топикстартера лок на операцию чтения, лок на операцию записи. топикстартер хочет делать чтение, инкрементить и делать запись (не смотря на то, что там уже может быть другое значение) - рейс такое разрешает в его модели данных
Vladimir
А вот результат будет неверным
Dmitriy / დიმიტრი
Вот пример кода: https://gist.github.com/shelomentsevd/00388cb9e19a4bad0a61fed784f2b3cb
Slava
ага
Slava
ты никак не можешь инкрементировать здесь
Slava
только через внешнюю синхронизацию
Dmitriy / დიმიტრი
ага
Dmitriy / დიმიტრი
Но мне и не нужна инкрементация. Мне нужен пример таких операций из-за которых если я логику внутри Read/Write написал неправильно, то всё сломается
Slava
просто пиши и читай с -race в разных потоках
Dmitriy / დიმიტრი
И я не могу придумать что такого написать что бы оно всё ломало😂
Slava
если нет лока - у тебя будет фейл
Slava
даже без -race у тебя в обычном приложении будет паника
Slava
в рантайме
Dmitriy / დიმიტრი
Да, думаю так и сделаю. Спасибо. А есть ли вообще какие-то советы как тестировать многопоточный код? Независимо от языка. Просто мне кажется, что некоторые вещи и логика многопоточного кода повторяется, а значит кто-то уже должен был это заметить и написать для этих случаев какие-то решения/советы
Slava
https://golang.org/doc/go1.8#mapiter
Slava
я думаю где-нибудь в книжках вроде многопоточное программирование итд
Slava
всё везде одинаковое, примитивы те же
Vasiliy
я не понял вопроса, можно подробнее? чтобы и другие подсказали
Консольное многоуровневое меню, возвращать только вверх по иерархии
Slava
тебе библиотека для рисования нужна?
Vasiliy
Нет, консоли
Vasiliy
Данные для меню формируются из базы
Vasiliy
Есть иерархия, конференции, у конференции доклады, у докладов описания со спикерами
Vasiliy
При нажатии назад всегда вверх
Slava
https://github.com/avelino/awesome-go#advanced-console-uis
Vasiliy
Там всё не то
Vasiliy
Есть структура, у неё поле массивом другой структуры и т.д.
Vasiliy
Родитель конференция, потомки доклады, глубже, глубже
Vasiliy
Нужно узнать какой именно конференции принадлежит доклад, или спикер какого доклада
Vasiliy
Как хранить парента
Сережа
в стеке, если ты возвращаться хочешь
Vasiliy
Если можно только текст передавать
Vasiliy
Стек пробовал, работает как история переходов
Vasiliy
Пользователь может зайти в одну конференцию, посмотреть доклады, вернуться и зайти в другую, там зайти в доклад, и нажимать назад
Vasiliy
Сейчас он гуляет по истории переходов
Vasiliy
Это со стеком