В вашей программе несколько проблем:
Первое: вы уже используете буфер для чтения / записи, поэтому нет необходимости использовать bufio.Writer
. Вы двойная буферизация с этим. Это также является причиной того, что вы не получите желаемый результат: вам нужно w.Flush()
перед закрытием канала, потому что вы не записали то, что в буферах bufio.Writer
, в канал:
if err == io.EOF {
w.Flush()
pw.Close()
break
}
Второе: вы сокращаете буфер. Как правило, read
не нужно читать, чтобы заполнить буфер. Если базовый поток является сетевым потоком, read
может считывать меньше размера буфера, и это не означает, что достигнут конец потока. Для файлов это не имеет никакого значения на практике, но в целом вы должны сделать следующее:
if n > 0 {
w.Write(buf[:n])
}
В-третьих: Вы измеряли? Маловероятно, что «более быстрая» реализация на самом деле быстрее. Включая буферизацию в io.Copy
, вы реализуете тройную буферизацию в этой реализации.