Go言語の練習に、zcat (gunzip -c) 相当を行う処理を書いてみました。これもGo言語らしくはない題材ですが。
// my_zcat.go
package main
import (
"fmt"
"os"
"bufio"
"compress/gzip"
)
func err_exit(err os.Error) {
fmt.Fprintf(os.Stderr,"ERROR: %s\n", err.String())
os.Exit(1)
}
func main() {
if len(os.Args) <= 1 {
fmt.Fprintf(os.Stderr, "Usage: my_zcat gzfile\n")
os.Exit(1)
}
gz,err := os.Open(os.Args[1], os.O_RDONLY, 0666)
// err != nil && err_exit(err)
if err != nil { err_exit(err) }
b_rd,err := bufio.NewReaderSize(gz, 32768)
if err != nil { err_exit(err) }
gz_rd,err := gzip.NewReader(b_rd)
if err != nil { err_exit(err) }
buf := make([]byte, 32768, 65536)
// b_wr,err := bufio.NewWriterSize(os.Stdout, 32768)
// if err != nil { err_exit(err) }
for {
n,err := gz_rd.Read(buf)
if err != nil {
if err == os.EOF {
break
}
err_exit(err)
}
os.Stdout.Write(buf[0:n])
// b_wr.Write(buf[0:n])
}
gz_rd.Close()
gz.Close()
return
}
makeの第3引数で指定するキャパシティの意味するところが、理解出来ていません。
それから、
err != nill && err_exit(err)
のようには書けませんでした。コンパイルエラーになります。
[user00@fedora14 ~]$ 6g my_zcat.go
my_zcat.go:24: err_exit(err) used as value
2011-04-02追記
実行イメージを書いていなかったので、追記です。
[user00@fedora14 ~]$ 6g my_zcat.go
[user00@fedora14 ~]$ 6l -o my_zcat my_zcat.6
[user00@fedora14 ~]$ ls -l my_zcat
-rwxrwxr-x 1 user00 user00 2143092 Apr 2 21:17 my_zcat
[user00@fedora14 ~]$ echo hello | gzip -c > hello.gz
[user00@fedora14 ~]$ ./my_zcat hello.gz
hello
[user00@fedora14 ~]$ cat /etc/services | gzip -c > test_data.gz ※少し大きいテストデータ
[user00@fedora14 ~]$ ./my_zcat test_data.gz | md5sum
77a7f18fe1508eec6c0f2b5e15b8804e -
[user00@fedora14 ~]$ md5sum /etc/services
77a7f18fe1508eec6c0f2b5e15b8804e /etc/services