golangを触って見た雑感
- 作者: 渋川よしき
- 出版社/メーカー: Lambda Note
- 発売日: 2017/10/19
- メディア: テキスト
- この商品を含むブログを見る
C言語はいろいろ大変だからgoでシステムプログラミングを学ぼうぜ。 という趣旨の本を読んでいる。ちょうど半分くらい(146/338)読めたのでgoの雑感でも適当に箇条書きで書いてみる。*1
goはtcfmで何度か触れられていたり、インタプリタ作る本が出ていたり
- 作者: Thorsten Ball,設樂洋爾
- 出版社/メーカー: オライリージャパン
- 発売日: 2018/06/16
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
で結構興味がある。直近でOSの仕組みを結構学んだのでそれに近いことも書かれているし、横浜で楽しそうな読書会をやっている
yokohama-go-reading.connpass.com
などなど、色んなタイミングが重なってちょうどいいかなと思って手に取ってみた次第です
$ go helloworld.go helloworld $ go build helloworld.go $ ls helloworld helloworld.go $ file helloworld helloworld: Mach-O 64-bit executable x86_64 $ ./helloworld helloworld
- 試していないがクロスコンパイルとかもできるらしい
https://qiita.com/Jxck_/items/02185f51162e92759ebe
- 逆アセンブルしてみようと思ったがバイナリサイズができすぎてよくわからなかった
$ ls -alt helloc helloworld -rwxr-xr-x 1 staff 8432 9 3 02:14 helloc -rwxr-xr-x 1 staff 2011816 9 3 02:13 helloworld
hellocはC言語のhelloworldだけど、goはその200倍近いサイズがある。
- ランタイムや何かでかいライブラリをリンクしているのかな。
goはgoとアセンブラで書かれている
- インターフェースの説明がわかりやすい
type Talker interface{ Talk() } //構造体GreeterにはTalkerを明示的に実装しているという情報は含めない //Javaのimplements的なやつがない type Greeter struct{ name String } //この宣言の時の(g Greeter)はレシーバ。どの構造体にインスタンスメソッドを実装するか、的なやつ func(g Greeter) Talk(){ fmt.Printf("hello,"g.name) } func main(){ var talker Talker talkder = &Greeter{"wozozo"} talkder.Talk() }
- メソッド名は大文字で書くとpublic,小文字で書くとprivateの可視性をもつ
- goのbufio.Writerのデフォルトバッファサイズは4096
- いろんなバッファ、4096のものが多い気がする
goのprint文は書いた分だけシステムコールが発行される
- C言語はバッファされる
p44より
(goには)残念ながらErlangの文法に組み込まれているバイナリパターンマッチのような強力なバイナリ解析はありません
- バイナリパターンマッチ、よくわからないけどErlang詳しい人に聞いたとところ、ヘッダの解析とかにめちゃくちゃ使えるらしい。
- goは関数呼び出し時に関数名に"go "をつけることでgoroutine(軽量スレッド)と呼ばれる並列処理が使える
- goのランタイムがOSっぽくこのスレッドを管理する
- CPUからOSからはプロセスが増えたようには見えないらしい
- Cだとfolkするとtopコマンドとかで表示されるプロセスが増える
- goのランタイムがOSっぽくこのスレッドを管理する
- goにはジェネリクスが 今の所ない
- go2で入るらしい
- goには例外がない
- channelというものを使って処理の動機を取ることができる
- FIFOっぽく使える
- rustみたいに特定のポスト特定の言語みたいなのを狙っている感じはない
- rustはC++の代替を目標?にしている空気がある
- goはML系言語をやっている人たちからあまり好ましく思われていない?らしい
本書はgoそのものの情報よりもシステムプログラミングのトピックが多い。HTTP2やファイルディスクリプタ,RESTやunix socketなどなど。
聞きかじりの知識と適当にググった情報でやってるけど大丈夫かな。*2
これはgoに限った話ではないけど、後発の言語は、以前の言語の問題点とかハマりポイントをうまく回避したり、 いろんな言語で成功している概念などを取り入れている印象があるので、特に使わなくても新しい言語を学んでおくメリットはあると思し、実際学んでみると結構楽しい。