2011年3月11日金曜日

Go言語でzcat

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

0 件のコメント:

コメントを投稿

人気ブログランキングへ にほんブログ村 IT技術ブログへ