Me gustaría abrir un archivo local y devolver un io.Reader
. La razón es que necesito alimentar io.Reader
a 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.Reader
a 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")
}
nil
puntero 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.File
es an io.Reader
(o de lo contrario la asignación no sería válida). Si va al patio de juegos y cambia *os.File
a *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.File
implementa la io.Reader
interfaz.
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)
bufio
para archivos grandes?
path/file.ext
. Ninguna otra respuesta explicó lo que os.File
era.
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
}