Я хотів би відкрити локальний файл і повернути файл io.Reader. Причина полягає в тому, що мені потрібно подати файл io.Readerдо бібліотеки, якою я користуюся, наприклад:
func read(r io.Reader) (results []string) {
}
Я хотів би відкрити локальний файл і повернути файл io.Reader. Причина полягає в тому, що мені потрібно подати файл 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визначала, що було.