最近学了下go语言, 写了几个程序下来觉得确实很方便。
主要是有几点,
- code syle定死了,省的以后浪费时间在code sytle上面的争论
- 大括号必须跟在函数后边,只有if和for,简单啊。
- 最方便的地方就是错误处理,可以返回一个返回值和一个专门处理错误码。
- 还有就是打的字很少。
- 用来处理参数的flag很好用,参数处理简单很多。
在主页http://golang.org 上面有许多文档, 另外还有几个中文的文档看着比较舒服:
http://code.google.com/p/golang-china/
http://code.google.com/p/ac-me/
package main import ( "os" "syscall" "flag" "fmt" ) var ofile = flag.String("of", "","out file") var ifile = flag.String("if", "", "in file") var seek = flag.Int64("seek", 0, "seek bytes") var skip = flag.Int64("skip", 0, "skip bytes") func main() { flag.Parse() of := os.Stdout inf := os.Stdin err := os.EINVAL fmt.Printf("of :%s if:%s n", *ofile, *ifile); if *ofile != "" { of, err = os.Create(*ofile) if of == nil { fmt.Printf("can open of:%s:%sn", ofile, err.String()) os.Exit(1) } } if *ifile != "" { inf, err = os.Open(*ifile) if inf == nil { fmt.Printf("can't oepn if:%s:%sn", ifile, err.String()) os.Exit(1) } } if *seek != 0 { sr,err := of.Seek(*seek, os.SEEK_CUR) if sr < 0 { fmt.Printf("seek error:%s:%sn", of.Name(), err.String()) os.Exit(1) } } if *skip != 0 { sr, err := inf.Seek(*skip, os.SEEK_CUR) if sr < 0 { fmt.Printf("skip error:%s:%sn", inf.Name(), err.String()) os.Exit(1) } } fmt.Printf("dd :%s to %sn", inf.Name(), of.Name()) const NBUF = 4096 var buffer [NBUF]byte for { switch nr, er := inf.Read(buffer[0:]); true { case nr < 0: fmt.Fprintf(os.Stderr, "dd: error when reading from %s:%sn", inf.Name(), er.String()) os.Exit(1) case nr == 0: inf.Close() of.Close() return case nr > 0: if nw, ew := of.Write(buffer[0:nr]); nw != nr{ fmt.Fprintf(os.Stderr,"dd: error writing to %s:%sn", of.Name(), ew.String()) } } } syscall.Sync() }
编译:
$ 8g dd.go && 8l -o dd dd.8
运行:
./dd -if qi.tar.gz -of tmp
用一个400M的包做测试:
time ./dd -if qi.tar.gz -of tmp
real 0m16.636s
user 0m0.152s
sys 0m1.764s
比起来要比dd要快一点:
time dd if=qi.tar.gz of=tmp
记录了843029+1 的读入
记录了843029+1 的写出
431631274字节(432 MB)已复制,21.1584 秒,20.4 MB/秒
real 0m21.229s
user 0m0.516s
sys 0m4.624s
不过估计是因为我们的dd里面用的是4K的buffer吧。
time dd if=qi.tar.gz of=tmp bs=4096
记录了105378+1 的读入
记录了105378+1 的写出
431631274字节(432 MB)已复制,13.7601 秒,31.4 MB/秒
real 0m13.925s
user 0m0.040s
sys 0m1.424s
果然, 换成4096的buffer size要比go写的快一点。
总之,用go写程序比较爽。