Goをぱっと紹介してみる

Goを勝手に紹介してみた
0
fkm @fkm

さてぼんやりGoについて

2014-08-31 00:34:11
fkm @fkm

まずは何もしないGoのコードから package main func main() { }

2014-08-31 00:40:04
fkm @fkm

Goでは、mainパッケージのmain()が最初に呼ばれる関数

2014-08-31 00:43:37
fkm @fkm

このままだとHello worldすら出せないので、標準ライブラリをimportします。まずはfmt package main import ( "fmt" )

2014-08-31 00:45:36
fkm @fkm

fmtをimportに書いたら、ようやくHello worldが書けます func main() { fmt.Printf("Hello world") }

2014-08-31 00:48:14
fkm @fkm

Goの場合、importして使ってないパッケージはコンパイル時に「エラー」になります。不要なものは何が何でも除去させる感じ。

2014-08-31 00:51:08
fkm @fkm

Hello worldができたので、次は変数。いきなり代入する場合は「変数名 := 値」 func main() { name := "Gopher" fmt.Printf("I'm %s", name) |

2014-08-31 00:54:17
fkm @fkm

Goの変数には型が無いように見えますが、型推論があるので先ほどのnameの型はstringになっています。

2014-08-31 00:59:59
fkm @fkm

型がでてきたところで、次は関数。といってもmain関数の書き方が既に登場してるので引数と戻り値のあるケースを func moke(n string) string { return n + "さま!" }

2014-08-31 01:03:09
fkm @fkm

引数の型や戻り値の型は、後ろに書きます。で、同じ型の引数はこんな感じでひとまとめにできます。 func moke(a, b, c string) { }

2014-08-31 01:05:18
fkm @fkm

GoのクラスはC++風味。というか構造体。 type Programmer struct { Name string Language string }

2014-08-31 01:09:27
fkm @fkm

structにメソッドを生やすには、funcの後にレシーバー書きます。 func (this *Programmer) write() { } レシーバーの変数名は何でもよくて、thisとかselfはあんまり使わないイメージ

2014-08-31 01:12:56
fkm @fkm

メソッドはレシーバー付き関数なので、Javaのように1クラス1ファイルに意地になって書く といった必要は無いです。1メソッド1ファイルも可能っちゃ可能

2014-08-31 01:16:40
fkm @fkm

型とメソッドまで出てきたら、次はinterface

2014-08-31 01:18:50
fkm @fkm

「こんなメソッドもっていればOK」という意味では他の言語と同じ type UserAPI interface { Create(name string) User Get(id string) User }

2014-08-31 01:21:35
fkm @fkm

Java / C# のように、明示的なimplementsは不要で、「シグネチャーが同じメソッドを全部もっていれば、そいつはそのinterfaceだ」という緩さ

2014-08-31 01:23:38
fkm @fkm

じゃあGoの関数についてもうすこし

2014-08-31 01:41:40
fkm @fkm

fkm: 戻り値複数書けます。戻り値の型を()でまとめます func (j *Json) GetString(key string) (string, error) { } // err -> errorに修正

2014-08-31 01:43:27
fkm @fkm

呼ぶ時はこんな感じ name, err := json.GetString("name")

2014-08-31 01:44:23
fkm @fkm

そして呼び側で変数errに代入してますが、これ、ifとかで使うコードが後ろに無いと「おい、err使ってねえぞ」とコンパイラに怒られます(エラー

2014-08-31 01:47:47
fkm @fkm

これだと、errは必ずnilになるのが分かっている時に使いづらいので、「ここは使わない!」という時用に_という特殊変数が用意されてます name, _ := json.GetString("name")

2014-08-31 01:49:57
fkm @fkm

あと、関数オブジェクトあります。 f := func() string { return "Hey!" }

2014-08-31 01:51:57
fkm @fkm

継承とは違うけど、こんな面白いことできます。 type NewInt int func (i NewInt) Run() { fmt.Printf("I am NewInt") }

2014-08-31 01:59:02
fkm @fkm

で、このNewIntを引数にとる関数を作ってみる func moke(i NewInt) { i.Run() }

2014-08-31 02:00:00
fkm @fkm

main関数で、これを呼んでみる func main() { moke(1) } これ、呼べます

2014-08-31 02:00:49