Chciałbym otworzyć plik lokalny i zwrócić plik io.Reader. Powodem jest to, że muszę przesłać a io.Readerdo biblioteki, której używam, na przykład:
func read(r io.Reader) (results []string) {
}
Chciałbym otworzyć plik lokalny i zwrócić plik io.Reader. Powodem jest to, że muszę przesłać a io.Readerdo biblioteki, której używam, na przykład:
func read(r io.Reader) (results []string) {
}
Odpowiedzi:
os.Open zwraca plik 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")
}
nilwskaźnik odpowiedniego typu, który wskazuje na plik os.File. (W tym przypadku tak naprawdę nie możesz nic przez to zrobić). A var _ io.Reader = (*os.File)(nil)przypisanie powoduje, że kompilator sprawdza, czy to *os.Filejest io.Reader(inaczej przypisanie nie byłoby prawidłowe). Jeśli przejdziesz do Playground i zmienisz *os.Filena *os.Process, zobaczysz błąd, który generuje dla rzeczy, które nie odpowiadają interfejsowi.
func (f *File) Read(b []byte) (n int, err error)samo co w Reader.
Użyj os.Open () :
func Open (nazwa string) (plik * plik, błąd err)
Otwórz otwiera nazwany plik do odczytu. Jeśli się powiedzie, do odczytu można użyć metod zwróconego pliku; powiązany deskryptor pliku ma tryb O_RDONLY. Jeśli wystąpi błąd, będzie to typ * PathError.
Zwrócona wartość typu *os.Fileimplementuje io.Readerinterfejs.
Typ * os.File implementuje interfejs io.Reader, więc możesz zwrócić plik jako Reader. Ale polecam skorzystać z pakietu bufio , jeśli masz zamiar czytać duże pliki, coś takiego:
file, err := os.Open("path/file.ext")
// if err != nil { ... }
return bufio.NewReader(file)
bufioduże pliki?
path/file.ext. Żadna inna odpowiedź nie wyjaśniała, co os.Filebyło.