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.Reader
mộ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.Reader
mộ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")
}
nil
con 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.File
là 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.File
sang, *os.Process
bạ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.File
thực hiện io.Reader
giao 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)
bufio
cho 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
}