basyura's blog

あしたになったらほんきだす。

Go の基礎

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