2015-12-24 2 views
0

код следующим образом ==[Golang] Почему считыватель bufio меняет строковый считыватель?

s := strings.NewReader("ABCDEFGJHIJK") 
fmt.Printf("pa is %d\n ", s.GetValueI()) //GetValueI() returns the value of r.i 

br := bufio.NewReader(s) 
fmt.Printf("papa is %d\n ", s.GetValueI()) 

cc, _ := br.ReadByte() 
fmt.Printf("%c\n", cc) 
fmt.Printf("papapa is %d\n ", s.GetValueI()) 

Отпечатки показывает: ра 0 папенька 0 papapa 12

Так weired результаты .. почему papapa является 12, когда bufio называют ReadByte()? Это действительно меня смущает.

ответ

2

Точка буферизованного считывателя должна читать поток данных более эффективно, независимо от того, какой размер читается.

При вызове ReadByte, если внутренний буфер пуст, он называет свой внутренний fill() способ пополнить буфер, который в этом случае потребляет весь strings.Reader. Затем из этого внутреннего буфера возвращается один байт.

+0

@ xie-jinke, чтобы повторить, вся точка буферизованного считывателя буферизует данные, которые она читает. Представьте, что вы завершаете 'os.File', а не' strings.Reader' в 'bufio.Reader', а затем читаете байты. Без буферизации чтение каждого байта потребовало бы выполнения syscall, запрашивающего ядро ​​для доступа к данным файла - чтобы получить только один данные обратно. Конечно, ядро ​​буферизует операции с файловой системой само по себе, но создание syscall - дорогостоящая операция. Используя буферизацию, вы разрешаете читателю сразу же запрашивать ядро ​​на несколько килобайт данных, а затем обслуживать ваши байтовые данные из буфера. – kostix

+0

@ xie-jinkie, если уж вы завернули читателя в экземпляр 'bufio.Reader', вы не должны делать никаких предположений о том, какие данные уже были прочитаны от основного читателя. С этого момента вы должны использовать только буферизованный читатель для выполнения всех чтений от основного читателя. То же самое относится к буферизованным писателям: вы не можете знать, какие данные уже были отправлены основному писателю, - до тех пор, пока вы вызовете метод 'Flush()' буферизованного писателя, и он завершит без возврата ошибки. – kostix

+0

Спасибо за подробное объяснение. Я получил точку проектирования bufio. –

Смежные вопросы