Eu gostaria de abrir um arquivo local e retornar a io.Reader. O motivo é que preciso alimentar um io.Readerpara uma biblioteca que estou usando, como:
func read(r io.Reader) (results []string) {
}
Eu gostaria de abrir um arquivo local e retornar a io.Reader. O motivo é que preciso alimentar um io.Readerpara uma biblioteca que estou usando, como:
func read(r io.Reader) (results []string) {
}
Respostas:
os.Open retorna um 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")
}
nilponteiro do tipo certo para apontar para um os.File. (Nesse caso, você não pode realmente fazer nada por meio dele.) E a var _ io.Reader = (*os.File)(nil)atribuição faz o compilador verificar se *os.Fileé um io.Reader(ou a atribuição não seria válida). Se você for ao Playground e mudar *os.Filepara, *os.Processverá o erro que ele gera para coisas que não satisfazem a interface.
func (f *File) Read(b []byte) (n int, err error), o mesmo que em Reader.
Use os.Open () :
função Open (name string) (file * File, err error)
Abrir abre o arquivo nomeado para leitura. Se for bem-sucedido, os métodos do arquivo retornado podem ser usados para leitura; o descritor de arquivo associado tem o modo O_RDONLY. Se houver um erro, será do tipo * PathError.
O valor retornado do tipo *os.Fileimplementa a io.Readerinterface.
O tipo * os.File implementa a interface io.Reader, para que você possa retornar o arquivo como um Leitor. Mas eu recomendo que você use o pacote bufio se você tiver intenções de ler arquivos grandes, algo assim:
file, err := os.Open("path/file.ext")
// if err != nil { ... }
return bufio.NewReader(file)
bufiopara arquivos grandes?
path/file.ext. Nenhuma outra resposta esclareceu o que os.Fileera.
Aqui está um exemplo em que abrimos um arquivo de texto e criamos um io.Reader a partir da instância * os.File f retornada
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
}