最近触り始めたGo言語で、勉強としてバイナリファイルを読み込んでHexダンプしてみました。
バイナリファイルといってもfile.Readを使った読み込みなのでバイナリかどうかはあまり関係ないかもしれない。
package main import ( "fmt" "os" ) func main() { argc := len(os.Args) if argc < 2 { fmt.Println("input file name.") return } filename := os.Args[1] f, err := os.Open(filename) if err != nil { fmt.Println("err:", err) return } c := make([]byte, 1) var buf []byte size := 0 for { len, r_err := f.Read(c) if len == 0 { break } size += len if r_err != nil { fmt.Println("err:", err) return } buf = append(buf, c[0]) } fmt.Printf("size:[%d]\n", size) for i := 0; i < size; i++ { fmt.Printf("%02X ", buf[i]) if i % 16 == 15 { fmt.Println("") } } }
感想
Go言語的な書き方がよくわからない
なんとなくC言語っぽく書いてみたけど、Go言語的に正しい書き方がよくわからない。
特にファイルから全データをリードする場合C言語だと大抵、EOFまで1byteずつreadするけどgoでもそんなのりでいいのかな・・・
配列とslice
RubyのArray的なのが使いたいけどgoだと配列とsliceを組み合わせて使うみたい。
sliceって機能と名前があってない気がする。
そもそも、goって名前自体英語だと普通の動詞になるので検索性がよくない。
例えば、for文について調べようとしたら
みたいな結果になった。やはり名前重要。
参考
Go言語を勉強するにあたって「基礎からわかるGo言語」を手元に置いて読んでいます。
- 作者: 古川昇
- 出版社/メーカー: シーアンドアール研究所
- 発売日: 2015/07/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
この書籍では前半で言語の基本的な機能について解説されていて、後半で逆引きサンプルが載っているのでかなり役に立っています。
今のところやりたいことに合わせて前半と後半をいったり来たりしながら読んでいます。
goらしい書き方についてはこの書籍だけでは掴めないので、go好きな人が書いたコードとかもっと読んだり写経した方がよさそう。