最近刚好快把Go的文件输入输出过完了,实现个小demo,用bufio包模拟Unix/Linux系统中的cat命令,demo的主要功能是:通过命令行参数接收文件名,将指定文件的内容输出到标准输出。如果没有提供文件名参数,则从标准输入读取内容并输出。
几个包的说明:
- bufio包提供了带缓冲的I/O操作,可以提高读写效率。
- flag包用于解析命令行参数。
package main
import (
"bufio"
"flag"
"fmt"
"io"
"os"
)
func cat(r *bufio.Reader){
for{
buf ,err := r.ReadBytes('\n') //注意是字符,也就是一行一行换行读取
if err == io.EOF{
break
}
fmt.Fprintf(os.Stdout,"%s",buf)
}
}
func main(){
flag.Parse() //解析命令行参数
if flag.NArg() == 0{
cat(bufio.NewReader(os.Stdin)) //如果没有参数默认从标准输入读取内容
}
for i:= 0 ; i<flag.NArg();i++{
f,err := os.Open(flag.Arg(i)) //返回一个error和一个file对象
if err != nil{
fmt.Fprintf(os.Stdout,"reading from %s failed, err %v\n",flag.Arg(i),err)
continue
}
cat(bufio.NewReader(f))
}
}
cat函数主体部分说明:
- cat函数接收一个*bufio.Reader类型的参数r。
- r.ReadBytes(‘\n’)方法从r中读取直到遇到换行符\n的字节序列,返回读取的字节序列buf和错误err。
- 使用fmt.Fprintf函数将读取到的buf内容格式化后输出到标准输出os.Stdout。
main函数主体部分说明:
1.if flag.NArg() == 0判断是否有命令行参数传入。如果没有参数,调用cat函数,传入bufio.NewReader(os.Stdin),即从标准输入读取内容。