Chciałbym otworzyć plik lokalny i zwrócić plik io.Reader
. Powodem jest to, że muszę przesłać a io.Reader
do 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.Reader
do 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")
}
nil
wskaź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.File
jest io.Reader
(inaczej przypisanie nie byłoby prawidłowe). Jeśli przejdziesz do Playground i zmienisz *os.File
na *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.File
implementuje io.Reader
interfejs.
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)
bufio
duże pliki?
path/file.ext
. Żadna inna odpowiedź nie wyjaśniała, co os.File
było.