код следующим образом ==[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()? Это действительно меня смущает.
@ xie-jinke, чтобы повторить, вся точка буферизованного считывателя буферизует данные, которые она читает. Представьте, что вы завершаете 'os.File', а не' strings.Reader' в 'bufio.Reader', а затем читаете байты. Без буферизации чтение каждого байта потребовало бы выполнения syscall, запрашивающего ядро для доступа к данным файла - чтобы получить только один данные обратно. Конечно, ядро буферизует операции с файловой системой само по себе, но создание syscall - дорогостоящая операция. Используя буферизацию, вы разрешаете читателю сразу же запрашивать ядро на несколько килобайт данных, а затем обслуживать ваши байтовые данные из буфера. – kostix
@ xie-jinkie, если уж вы завернули читателя в экземпляр 'bufio.Reader', вы не должны делать никаких предположений о том, какие данные уже были прочитаны от основного читателя. С этого момента вы должны использовать только буферизованный читатель для выполнения всех чтений от основного читателя. То же самое относится к буферизованным писателям: вы не можете знать, какие данные уже были отправлены основному писателю, - до тех пор, пока вы вызовете метод 'Flush()' буферизованного писателя, и он завершит без возврата ошибки. – kostix
Спасибо за подробное объяснение. Я получил точку проектирования bufio. –