golang:从本地文件创建一个io.Reader

Xi *_*ang 70 go

我想打开一个本地文件,然后返回一个io.Reader.原因是我需要将io.Reader提供给我正在使用的库,例如:

func read(r io.Reader) (results []string) {

}
Run Code Online (Sandbox Code Playgroud)

fab*_*ioM 86

os.Open 返回一个 io.Reader

http://play.golang.org/p/BskGT09kxL

package main

import (
    "fmt"
    "io"
    "os"
)

var _ io.Reader = (*os.File)(nil)

func main() {
    fmt.Println("Hello, playground")
}
Run Code Online (Sandbox Code Playgroud)

  • 嘿,喜欢显示(*os.File)是一个io.Reader而无法从Playground打开文件的技巧. (21认同)
  • @mschuett或多或少:它是一个指向`os.File`的正确类型的`nil`指针.(在这种情况下,你无法通过它做任何事情.)并且`var _ io.Reader =(*os.File)(nil)`赋值使编译器检查`*os.File`是一个` io.Reader`(否则赋值无效).如果你去Playground并将`*os.File`改为`*os.Process`,你会看到它为不满足接口的东西生成的错误. (6认同)
  • 这段代码到底在干什么 (4认同)
  • @fabrizioM在文档中确切地指出* os.File实现了Reader。否则,如果没有此答案,您如何仅阅读正式文档就能弄清楚自己?好的,我看到`func(f * File)Read(b [] byte)(n int,err error)`,与`Reader`中的一样。 (2认同)

ANi*_*sus 35

使用os.Open():

func Open(名称字符串)(文件*文件,错误错误)

打开打开指定的文件进行阅读.如果成功,返回文件上的方法可用于读取; 关联的文件描述符具有模式O_RDONLY.如果有错误,则其类型为*PathError.

type的返回值*os.File实现io.Reader接口.


Yan*_*ozo 19

类型*os.File实现了io.Reader接口,因此您可以将文件作为Reader返回.但是如果您有读取大文件的意图,我建议您使用bufio包,如下所示:

file, err := os.Open("path/file.ext")
// if err != nil { ... }

return bufio.NewReader(file)
Run Code Online (Sandbox Code Playgroud)

  • 你能详细说明为什么你推荐`bufio`用于大文件吗? (3认同)

spa*_*her 7

这是我们打开一个文本文件并从返回的 *os.File 实例 f 创建一个 io.Reader 的示例

package main

import (
    "io"
    "os"
)

func main() {
    f, err := os.Open("somefile.txt")
    if err != nil {
        panic(err)
    }
    defer f.Close()

    var r io.Reader
    r = f
}
Run Code Online (Sandbox Code Playgroud)