ฉันต้องการเปิดไฟล์ในเครื่องและส่งคืนไฟล์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
}