Vorrei aprire un file locale e restituire un file io.Reader. Il motivo è che devo fornire io.Readera una libreria che sto utilizzando, come:
func read(r io.Reader) (results []string) {
}
Vorrei aprire un file locale e restituire un file io.Reader. Il motivo è che devo fornire io.Readera una libreria che sto utilizzando, come:
func read(r io.Reader) (results []string) {
}
Risposte:
os.Open restituisce 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")
}
nilpuntatore del tipo giusto per puntare a un file os.File. (In questo caso, non puoi davvero fare nulla attraverso di esso.) E l' var _ io.Reader = (*os.File)(nil)assegnazione fa in modo che il compilatore controlli che *os.Filesia un io.Reader(altrimenti l'assegnazione non sarebbe valida). Se vai al Playground e cambi *os.Filein *os.Processvedrai l'errore che genera per cose che non soddisfano l'interfaccia.
func (f *File) Read(b []byte) (n int, err error), lo stesso di Reader.
Usa os.Open () :
func Open (stringa del nome) (file * File, errore err)
Apri apre il file denominato per la lettura. In caso di successo, i metodi sul file restituito possono essere utilizzati per la lettura; il descrittore di file associato ha la modalità O_RDONLY. Se c'è un errore, sarà di tipo * PathError.
Il valore restituito di tipo *os.Fileimplementa l' io.Readerinterfaccia.
Il tipo * os.File implementa l'interfaccia io.Reader, quindi puoi restituire il file come Reader. Ma ti consiglio di usare il pacchetto bufio se hai intenzione di leggere file di grandi dimensioni, qualcosa del genere:
file, err := os.Open("path/file.ext")
// if err != nil { ... }
return bufio.NewReader(file)
bufioper file di grandi dimensioni?
path/file.ext. Nessun'altra risposta specificava cosa os.Filefosse.
Ecco un esempio in cui apriamo un file di testo e creiamo un io.Reader dall'istanza f di * os.File restituita
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
}