Мерль
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
насколько помню два раза добавив хэдер с разным значением такой результат и получишь
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)
}
Aleksand
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 привет! можно вопрос - как реализовать тексттовое меню, только с подъёмом вверх по иерархии? что можешь посоветовать?
Dmitriy / დიმიტრი
Vasiliy
@m0sth8 я это, один и подслушателей голанг шоу)
Vasiliy
респект за подкаст
Vasiliy
http://golangshow.com
Anton
Slava
Slava
Я вот и не знаю какой тест ещё придумать
тест с -race поломается, если доступ к полю у тебя будет не защищён. Но защита поля на запись и чтения не значит что тебе не надо защищать более сложные операции
Slava
можешь рассказать более подробно, что ты пытаешься протестировать?
Dmitriy / დიმიტრი
Slava
да, иначе не понять, может у тебя структура только внутри одной горутины всегда работает
Vladimir
Vladimir
На как раз пачку горутин которые параллельно что то делают
Vladimir
https://golang.org/doc/articles/race_detector.html
Dmitriy / დიმიტრი
окей. поставлю вопрос по другому. Допустим нет -race, как мне проверить что логика не нарушилась?
Vladimir
Vladimir
Как это нету?
Сережа
никак, тесты могут показать наличие ошибок, а не их отсутствие
Slava
Slava
если у тебя не compare and swap, то ты не можешь инкрементить без лока на всю структуру на несколько операций
Vladimir
Slava
нет
Slava
рейс видит, что ты атомарно читаешь и атомарно пишешь
Michael
как закончите, по результатам оформите статью?
Slava
но он не видит, что ты хочешь атомарно прочитать и записать в одной транзакции
Dmitriy / დიმიტრი
Dmitriy / დიმიტრი
Что-то я короче загоняюсь
Vladimir
Vladimir
И используешь его
Vladimir
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
всё везде одинаковое, примитивы те же
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
Это со стеком