Я хотел бы открыть локальный файл и вернуть io.Reader
. Причина в том, что мне нужно передать a io.Reader
в библиотеку, которую я использую, например:
func read(r io.Reader) (results []string) {
}
Я хотел бы открыть локальный файл и вернуть io.Reader
. Причина в том, что мне нужно передать a io.Reader
в библиотеку, которую я использую, например:
func read(r io.Reader) (results []string) {
}
Ответы:
os.Open
возвращает 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
указатель правильного типа, указывающий на os.File
. (В этом случае вы действительно ничего не можете сделать через него.) И var _ io.Reader = (*os.File)(nil)
назначение заставляет компилятор проверять, что *os.File
это io.Reader
(иначе присвоение было бы недействительным). Если вы перейдете на площадку и переключитесь *os.File
на, *os.Process
вы увидите ошибку, которую он генерирует для вещей, которые не соответствуют интерфейсу.
func (f *File) Read(b []byte) (n int, err error)
, как в Reader
.
Используйте os.Open () :
func Open (строка имени) (файл * файл, ошибка ошибки)
Открыть открывает указанный файл для чтения. В случае успеха методы возвращенного файла можно использовать для чтения; связанный дескриптор файла имеет режим O_RDONLY. Если есть ошибка, она будет типа * PathError.
Возвращаемое значение типа *os.File
реализует io.Reader
интерфейс.
Тип * os.File реализует интерфейс io.Reader, поэтому вы можете вернуть файл как Reader. Но я рекомендую вам использовать пакет bufio , если вы собираетесь читать большие файлы, примерно так:
file, err := os.Open("path/file.ext")
// if err != nil { ... }
return bufio.NewReader(file)
bufio
для больших файлов?
path/file.ext
. Никакой другой ответ не объяснял, что os.File
было.
Вот пример, в котором мы открываем текстовый файл и создаем io.Reader из возвращенного экземпляра * os.File 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
}