
Серж
23.06.2017
09:04:57
в го не делает
я так понял, что flush нужен bufio.Writer это в нем буфер, если вызвать file.Sync - это будет системный вызов и если из bufio.Writer байты не пришли, то записано тоже ничего не будет

Димка
23.06.2017
09:05:48
вру :)

Andrew
23.06.2017
09:05:57
Я чот ни разу не вызывал Flush, но все файлы у меня записываются целиком. И брат жив. ))

Google

Michael
23.06.2017
09:06:28
fsync & flsuh - are different things
и вообще - во всём виноват с++

Серж
23.06.2017
09:06:51
да, приучает к RAII

Michael
23.06.2017
09:07:44
не, RAII кое-где упоминается

Серж
23.06.2017
09:08:07
кстати, зачем использовать bufio, если ОС сама буферизирует файловые операции?

Michael
23.06.2017
09:08:12
а так - целься и стреляй куда и во что хочешь

Серж
23.06.2017
09:08:19
дабл буфер? чтобы еще быстрее?

Michael
23.06.2017
09:08:23
причём разные компиляторы - по-разному
система сама шедулит ио

Andrew
23.06.2017
09:09:20

Michael
23.06.2017
09:09:30
при падении софта система фсюнкнет буферы и данные попадут на винт
я б не был так уверен
так как есть кэши и на чтение

Google

Michael
23.06.2017
09:10:15
особенно когда читаешь блоками

Andrew
23.06.2017
09:10:15
Ок, снизил уверенность на 50% ))

Антон
23.06.2017
09:10:51

Michael
23.06.2017
09:10:58
флаш из буфио нужен для кастомной реализации буфера
писать в буфер в озу куда быстрее чем дергать ось
ось же оптимизирует запись в целом на винт

Серж
23.06.2017
09:12:12
я говорю именно про этот случай

Andrew
23.06.2017
09:12:15

Michael
23.06.2017
09:13:06
апи то системное используется

Серж
23.06.2017
09:13:09
у него там слайс в памяи уже готовый он из него пишет в bufio

Michael
23.06.2017
09:13:46
надо выпить и слайсом бекона закусить

Andrew
23.06.2017
09:15:52
Требую поделиться беконом на github'е

Димка
23.06.2017
09:21:55

Серж
23.06.2017
09:22:23
я не знаю
наверное нет
может есть метод который можно вызвать чтобы предотвратить flush в деструкторе
может там есть bool, что flush уже был вызван и если новые данные не добавляются, то в деструкторе flush не вызывается

Димка
23.06.2017
09:23:48
просто если не надо записывать данные, (в случаи ошибки например) то в Го реализация лучше

Google

Серж
23.06.2017
09:24:01
это то - о чем программист на высокоуровневом языке не думает
так ты проверяй на ошибку данные до того, как в ostream писать

Димка
23.06.2017
09:25:04
это то понятно, но всякое же бывает

anton
23.06.2017
09:34:26
ну вы развели тут :)

Мерлин
23.06.2017
12:51:22
GetStream/vg: Virtualgo: A dep compatible solution to problems caused by the vendor directory
https://github.com/getstream/vg

Aleksandr
23.06.2017
13:14:46
а кто-нибудь в курсе есть ли в стандартной библиотеке (net/http) нормальные возможности для записи множества заголовков с одним именем? Если Set-Cookie разруливается отдельно, то для заложенных в RFC возможностей вроде
Cache-Control: no-cache, no-storeкоторый эквивалентен
Cache-Control: no-cache
Cache-Control: no-storeкак быть уже непонятно совсем

Aleksandr
23.06.2017
13:16:23
насколько помню два раза добавив хэдер с разным значением такой результат и получишь

Aleksandr
23.06.2017
13:17:11

Aleksandr
23.06.2017
13:17:30
ну так все правильно
мап слайсов
// 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)
}

Aleksandr
23.06.2017
13:21:50

Monday Begins on Saturday
23.06.2017
18:10:08
Есть объект с RWMutex'ом и двумя методами Read(key string) (err error, value int) и Write(key string, val int) (err error).
Какой можно написать unit-тест что бы проверить, что код потокобезопасный?
Сначала думал создать 10 горутин и запустить в них цикл со счетчиком до 100, где каждая горутина бы получала доступ к одному и тому же ключу и приплюсовывала 1, тогда если бы по окончанию работы на Read выводилось значение 1000, то тест был пройден. Но тут мьютекс внутри и замыкается/размыкается внутри методов и так не получится сделать

Slava
23.06.2017
18:17:35
Запускай тест с ключом -race
Тест что ты описываешь выше - не верный, так как он предполагает атомарность на группу вызовов (read/write)

Vasily
23.06.2017
18:26:32
@m0sth8 привет! можно вопрос - как реализовать тексттовое меню, только с подъёмом вверх по иерархии? что можешь посоветовать?

Monday Begins on Saturday
23.06.2017
18:26:51

Vasily
23.06.2017
18:27:01
@m0sth8 я это, один и подслушателей голанг шоу)
респект за подкаст

Monday Begins on Saturday
23.06.2017
18:28:03

Google

anton
23.06.2017
19:13:03

Vasily
23.06.2017
19:13:28
http://golangshow.com

anton
23.06.2017
19:29:18

Slava
23.06.2017
21:08:50
Я вот и не знаю какой тест ещё придумать
тест с -race поломается, если доступ к полю у тебя будет не защищён. Но защита поля на запись и чтения не значит что тебе не надо защищать более сложные операции
можешь рассказать более подробно, что ты пытаешься протестировать?

Monday Begins on Saturday
23.06.2017
21:13:01

Slava
23.06.2017
21:14:28
да, иначе не понять, может у тебя структура только внутри одной горутины всегда работает

Monday Begins on Saturday
23.06.2017
21:17:25

Vladimir
23.06.2017
21:18:10
На как раз пачку горутин которые параллельно что то делают
https://golang.org/doc/articles/race_detector.html

Monday Begins on Saturday
23.06.2017
21:19:53
окей. поставлю вопрос по другому. Допустим нет -race, как мне проверить что логика не нарушилась?

Vladimir
23.06.2017
21:20:12
Как это нету?

Серж
23.06.2017
21:20:28
никак, тесты могут показать наличие ошибок, а не их отсутствие

Slava
23.06.2017
21:21:34
если у тебя не compare and swap, то ты не можешь инкрементить без лока на всю структуру на несколько операций

Vladimir
23.06.2017
21:23:47

Slava
23.06.2017
21:24:01
нет

Google

Slava
23.06.2017
21:24:24
рейс видит, что ты атомарно читаешь и атомарно пишешь

Michael
23.06.2017
21:24:33
как закончите, по результатам оформите статью?

Slava
23.06.2017
21:24:41
но он не видит, что ты хочешь атомарно прочитать и записать в одной транзакции

Monday Begins on Saturday
23.06.2017
21:25:47

Vladimir
23.06.2017
21:25:55

Monday Begins on Saturday
23.06.2017
21:26:04
Что-то я короче загоняюсь

Vladimir
23.06.2017
21:26:09
И используешь его

Slava
23.06.2017
21:27:23

Vladimir
23.06.2017
21:27:39
А вот результат будет неверным

Monday Begins on Saturday
23.06.2017
21:28:24
Вот пример кода:
https://gist.github.com/shelomentsevd/00388cb9e19a4bad0a61fed784f2b3cb

Slava
23.06.2017
21:38:36
ага
ты никак не можешь инкрементировать здесь
только через внешнюю синхронизацию

Monday Begins on Saturday
23.06.2017
21:41:29
ага