go readline - > string

jz8*_*z87 10 go

在Go中使用readline进行字符串的惯用方法是什么?标准库中提供的原始函数看起来非常低级,它们返回字节数组.有没有内置的更简单的方法来从readline函数中获取字符串?

Mal*_*olm 13

我写了一种方法来轻松读取文件中的每一行.Readln(*bufio.Reader)函数从底层的bufio.Reader结构返回一行(sans \n).

// Readln returns a single line (without the ending \n)
// from the input buffered reader.
// An error is returned iff there is an error with the
// buffered reader.
func Readln(r *bufio.Reader) (string, error) {
  var (isPrefix bool = true
       err error = nil
       line, ln []byte
      )
  for isPrefix && err == nil {
      line, isPrefix, err = r.ReadLine()
      ln = append(ln, line...)
  }
  return string(ln),err
}
Run Code Online (Sandbox Code Playgroud)

您可以使用Readln读取文件中的每一行.以下代码读取文件中的每一行,并将每行输出到stdout.

f, err := os.Open(fi)
if err != nil {
    fmt.Println("error opening file= ",err)
    os.Exit(1)
}
r := bufio.NewReader(f)
s, e := Readln(r)
for e == nil {
    fmt.Println(s)
    s,e = Readln(r)
}
Run Code Online (Sandbox Code Playgroud)

干杯!

  • 这很棒,但使用追加非常糟糕.如果您将该行切换为复制(ln,line),则该函数的运行速度将提高约20倍.这对我来说是必须的,因为我正在解析多GB的文件. (4认同)
  • @mschuett你可以与副本共享修改过的代码吗? (3认同)

pet*_*rSO 11

以下是使用bufio.ReadLinebufio.ReadString的一些示例.

 package main

import (
    "bufio"
    "fmt"
    "os"
)

func ReadLine(filename string) {
    f, err := os.Open(filename)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer f.Close()
    r := bufio.NewReaderSize(f, 4*1024)
    line, isPrefix, err := r.ReadLine()
    for err == nil && !isPrefix {
        s := string(line)
        fmt.Println(s)
        line, isPrefix, err = r.ReadLine()
    }
    if isPrefix {
        fmt.Println("buffer size to small")
        return
    }
    if err != io.EOF {
        fmt.Println(err)
        return
    }
}

func ReadString(filename string) {
    f, err := os.Open(filename)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer f.Close()
    r := bufio.NewReader(f)
    line, err := r.ReadString('\n')
    for err == nil {
        fmt.Print(line)
        line, err = r.ReadString('\n')
    }
    if err != io.EOF {
        fmt.Println(err)
        return
    }
}

func main() {
    filename := `testfile`
    ReadLine(filename)
    ReadString(filename)
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您今天正在查看此内容,则需要使用io.EOF代替os.EOF. (8认同)
  • @PedroLuz 那个论点,为什么我们不都在汇编中编码? (2认同)