Tôi muốn mở một tệp cục bộ và trả về a io.Reader. Lý do là tôi cần cung cấp io.Readermột thư viện mà tôi đang sử dụng, như:
func read(r io.Reader) (results []string) {
}
Tôi muốn mở một tệp cục bộ và trả về a io.Reader. Lý do là tôi cần cung cấp io.Readermột thư viện mà tôi đang sử dụng, như:
func read(r io.Reader) (results []string) {
}
Câu trả lời:
os.Open trả lại một 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")
}
nilcon trỏ đúng loại để trỏ đến os.File. (Trong trường hợp này, bạn thực sự không thể làm bất cứ điều gì thông qua nó.) Và var _ io.Reader = (*os.File)(nil)nhiệm vụ làm cho trình biên dịch kiểm tra xem có phải *os.Filelà một io.Reader(hoặc nếu không thì nhiệm vụ sẽ không hợp lệ). Nếu bạn đi đến Playground và thay đổi *os.Filesang, *os.Processbạn sẽ thấy lỗi mà nó tạo ra cho những thứ không đáp ứng giao diện.
func (f *File) Read(b []byte) (n int, err error), giống như trong Reader.
Sử dụng os.Open () :
func Mở (chuỗi tên) (tệp * Tệp, lỗi err)
Mở sẽ mở tệp đã đặt tên để đọc. Nếu thành công, các phương thức trên tệp trả về có thể được sử dụng để đọc; bộ mô tả tệp được liên kết có chế độ O_RDONLY. Nếu có lỗi, nó sẽ có kiểu * PathError.
Giá trị trả về của kiểu *os.Filethực hiện io.Readergiao diện.
Kiểu * os.File triển khai giao diện io.Reader, vì vậy bạn có thể trả lại tệp dưới dạng Trình đọc. Nhưng tôi khuyên bạn nên sử dụng gói bufio nếu bạn có ý định đọc các tệp lớn, như sau:
file, err := os.Open("path/file.ext")
// if err != nil { ... }
return bufio.NewReader(file)
bufiocho các tệp lớn không?
path/file.ext. Không có câu trả lời nào khác chính xác là gì os.File.
Đây là một ví dụ mà chúng tôi mở một tệp văn bản và tạo một io.Reader từ thể hiện * os.File trả về 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
}