Me gustaría abrir un archivo local y devolver un io.Reader. La razón es que necesito alimentar io.Readera una biblioteca que estoy usando, como:
func read(r io.Reader) (results []string) {
}
Me gustaría abrir un archivo local y devolver un io.Reader. La razón es que necesito alimentar io.Readera una biblioteca que estoy usando, como:
func read(r io.Reader) (results []string) {
}
Respuestas:
os.Open devuelve un 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")
}
nilpuntero del tipo correcto para apuntar a un os.File. (En este caso, realmente no puede hacer nada a través de él). Y la var _ io.Reader = (*os.File)(nil)asignación hace que el compilador compruebe que *os.Filees an io.Reader(o de lo contrario la asignación no sería válida). Si va al patio de juegos y cambia *os.Filea *os.Process, verá el error que genera para las cosas que no satisfacen la interfaz.
func (f *File) Read(b []byte) (n int, err error), lo mismo que en Reader.
Utilice os.Open () :
func Open (cadena de nombre) (archivo * Archivo, error err)
Abrir abre el archivo con nombre para su lectura. Si tiene éxito, los métodos del archivo devuelto se pueden usar para leer; el descriptor de archivo asociado tiene el modo O_RDONLY. Si hay un error, será de tipo * PathError.
El valor devuelto de tipo *os.Fileimplementa la io.Readerinterfaz.
El tipo * os.File implementa la interfaz io.Reader, por lo que puede devolver el archivo como Reader. Pero te recomiendo que uses el paquete bufio si tienes intenciones de leer archivos grandes, algo como esto:
file, err := os.Open("path/file.ext")
// if err != nil { ... }
return bufio.NewReader(file)
bufiopara archivos grandes?
path/file.ext. Ninguna otra respuesta explicó lo que os.Fileera.
Aquí hay un ejemplo en el que abrimos un archivo de texto y creamos un io.Reader a partir de la instancia * os.File devuelta f
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
}