Go语言使用切片读写文件 图片看不了?点击切换HTTP 返回上层
切片提供了 Go语言中处理 I/O 缓冲的标准方式,下面 cat 函数的第二版中,在一个切片缓冲内使用无限 for 循环(直到文件尾部 EOF)读取文件,并写入到标准输出(os.Stdout)。
下面的代码使用了 os 包中的 os.file 和 Read 方法;与上一节示例代码具有同样的功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | func cat(f *os.File) { const NBUF = 512 var buf [NBUF]byte for { switch nr, err := f. Read (buf[:]); true { case nr < 0: fmt.Fprintf(os.Stderr, "cat: error reading: %s\n" , err.Error()) os.Exit(1) case nr == 0: // EOF return case nr > 0: if nw, ew := os.Stdout.Write(buf[0:nr]); nw != nr { fmt.Fprintf(os.Stderr, "cat: error writing: %s\n" , ew.Error()) } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | package main import ( "flag" "fmt" "os" ) func cat(f *os.File) { const NBUF = 512 var buf [NBUF]byte for { switch nr, err := f. Read (buf[:]); true { case nr < 0: fmt.Fprintf(os.Stderr, "cat: error reading: %s\n" , err.Error()) os.Exit(1) case nr == 0: // EOF return case nr > 0: if nw, ew := os.Stdout.Write(buf[0:nr]); nw != nr { fmt.Fprintf(os.Stderr, "cat: error writing: %s\n" , ew.Error()) } } } } func main() { flag.Parse() // 扫描arg列表并设置标志 if flag.NArg() == 0 { cat(os.Stdin) } for i := 0; i < flag.NArg(); i++ { f, err := os. Open (flag.Arg(i)) if f == nil { fmt.Fprintf(os.Stderr, "cat: can't open %s: error %s\n" , flag.Arg(i), err) os.Exit(1) } cat(f) f. Close () } } |