C は挫折中(めんどくさい)。
なんとなく見始めた Go が面白くてそのまま学習中。コンパイルが早いし、vimmer の場合は quickrun を使うとスクリプトを書いてるような手軽感がある。
文法もそんなに難しくない。ポインタは参照が中心で難しい感じではなく、GC があるので malloc や free を考えなくてもいい。ロジックに集中できる。
インストール
mac なら brew で入れられる
brew install go
環境変数も定義
export GOROOT=/usr/local/Cellar/go/HEAD export GOOS=darwin export GOARCH=amd64
windows なら gomingw でいい感じのものが配布されているのでインストーラを使うか zip を展開してパスを通す。環境変数も定義(32bitの場合)
GOROOT="goの展開フォルダ" GOOS=windows GOARCH=386 GOBIN=%GOROOT%\bin PATH=%GOBIN%;%PATH%
コンパイル & 実行
mac なら
6g test.go 6l test.6 ./6.out
windows なら
8g test.go 8l test.8 8.exe
変数定義
var を使うか := を使う。
:= を使うと初期値を指定する代わりに型指定が不要になる。
大文字始まりは Global で 小文字始まりは local な変数になる。メソッドも同じ。
文字列
var name1 = "basyura1" var name2 string = "basyura2" name3 := "basyura3" fmt.Printf(name1 + "\n") fmt.Printf(name2 + "\n") fmt.Printf(name3 + "\n")
配列
var list1 []string = []string{"a", "b", "c"} var list2 = []string{"a", "b", "c"} list3 := []string{"a", "b", "c"} for i := 0; i < len(list1); i++ { fmt.Printf("list1[%d] = %s\n", i, list1[i]) } for i, v := range list2 { fmt.Printf("list2[%d] = %s\n", i, v) } for _, v := range list3 { fmt.Printf(v + "\n") }
for 文にある _ は、range から返ってくる値の一つを捨てる(使わない)記述。
連想配列
var map1 = map[string]string{"a": "A", "b": "B", "c": "C"} fmt.Printf("a -> %s\n", map1["a"]) fmt.Printf("b -> %s\n", map1["b"]) fmt.Printf("c -> %s\n", map1["c"]) map2 := map[string]int{"a": 1, "b": 2, "c": 3} for k, v := range map2 { fmt.Printf("%s → %d\n", k, v) }
オブジェクト
"type 型名 struct" で型を宣言。
"func (変数 型名) メソッド名() 戻り値" がメソッド定義になる。
type Cat struct { name string } func (cat Cat) Say() string { return cat.name + " say nya-" } var cat1 = new(Cat) cat1.name = "basyur1" fmt.Printf(cat1.Say() + "\n") var cat2 = &Cat{"basyura2"} fmt.Printf(cat2.Say() + "\n")
インタフェース
あるオブジェクトがあるインタフェースを実装しているか否かは、あるインタフェースのメソッドを全て実装しているかどうかで判定される。
type Animal interface { Say() string } func say(animal Animal) { fmt.Printf("say interface → " + animal.Say() + "\n") } say(cat1) say(cat2)
Web を漁るよりも、まずは Go 本を読んだほうが基礎を理解しやすいと思う。おすすめ。
あとは、golang.jp。