File 在go中逐字节处理文件

File 在go中逐字节处理文件,file,go,io,character,byte,File,Go,Io,Character,Byte,与之类似,在go中一次处理一个字节的文件的惯用方法是什么 换句话说,有没有更好的方法来写下面的内容 file, err := ioutil.ReadFile(filename) file_string = string(file) for i, c := range file_string { // -snip- } 您一次将整个文件作为字符串(而不是字节)读取,然后逐个符文(而不是逐字节)处理它。要一次读取一个字节的文件(这很可能不是您想要的),您必须严格执行以下操作: f, err

与之类似,在go中一次处理一个字节的文件的惯用方法是什么

换句话说,有没有更好的方法来写下面的内容

file, err := ioutil.ReadFile(filename)
file_string = string(file)
for i, c := range file_string {
    // -snip-
}

您一次将整个文件作为字符串(而不是字节)读取,然后逐个符文(而不是逐字节)处理它。要一次读取一个字节的文件(这很可能不是您想要的),您必须严格执行以下操作:

f, err := os.Open("path")
if err != nil {
    panic(err)
}

b := make([]byte, 1)

for err := f.Read(b) {
    if err != nil && !errors.Is(err, io.EOF) {
        fmt.Println(err)
        break
    }

    // process the one byte b[0]

    if err != nil {
        // end of file
        break
    }
}
但是,您更可能希望高效地读取文件,并一次处理一个字节。为此,您应使用:


这不是一次读取一个字节的文件。这是读取整个文件,将其转换为字符串,并逐符文(而不是逐字节)对其进行迭代。您是希望一次读取一个字节的文件,还是一次处理一个字节的文件?一次读取一个字节的效率极低,您可能需要以下内容:
f, err := os.Open("path")
if err != nil {
    panic(err)
}

br := bufio.NewReader(f)

for b,err := br.ReadByte() {
    if err != nil && !errors.Is(err, io.EOF) {
        fmt.Println(err)
        break
    }

    // process the one byte b

    if err != nil {
        // end of file
        break
    }
}