在使用很多函数的时候需要传入 string 字符串 , 但是函数参数类型是 io.Reader
, 这时候就需要将 string 转换为 Reader 类型
例如下面的:
strings.NewReader("aaaa")
NewReader 返回从读取的新 Reader。 它类似于 bytes.NewBufferString
, 但效率更高且只读。
bytes.NewBuffer([]byte("aaaaa"))
bytes.NewBufferString("aaaa")
bytes.NewReader([]byte("aaaa"))
Buffer 是具有 Read 和 Write 方法的可变大小的字节缓冲区。 Buffer 的零值是可以使用的空缓冲区。
上面这俩都行
strings.NewReader(string(body))
golang 的库 bufio.Scanner 是非常方便用来处理文本文件。
下面的例子是按行读取文本文件。
package main
import (
"os"
"log"
"fmt"
"bufio"
)
func main() {
err := HandleText("a.txt")
if err != nil {
panic(err)
}
}
func HandleText(textfile string) error {
file, err := os.Open(textfile)
if err != nil {
log.Printf("Cannot open text file: %s, err: [%v]", textfile, err)
return err
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text() // or
//line := scanner.Bytes()
//do_your_function(line)
fmt.Printf("%s\n", line)
}
if err := scanner.Err(); err != nil {
log.Printf("Cannot scanner text file: %s, err: [%v]", textfile, err)
return err
}
return nil
}
bufio.Reader 是 go 早期的版本也是用来处理文本, 使用起来有一些不方便, 例如需要处理行太长的问题, 而 bufio.Scanner 是 go1.1 中新增加的功能, 既然是新加的功能肯定是修正之前的不足, 在使用上更加方便, 比如就不用处理行太长的问题。
总之就是 bufio.Scanner 是后开发的模块, 功能更强大, 使用更方便。