ฉันต้องการเปิดไฟล์ในเครื่องและส่งคืนไฟล์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(มิฉะนั้นการมอบหมายจะไม่ถูกต้อง) หากคุณไปที่ Playground และเปลี่ยน*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 ไฟล์ใช้อินเทอร์เฟซ 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 ที่ส่งคืนไฟล์อินสแตนซ์ 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
}