このままだとHello worldすら出せないので、標準ライブラリをimportします。まずはfmt package main import ( "fmt" )
2014-08-31 00:45:36fmtをimportに書いたら、ようやくHello worldが書けます func main() { fmt.Printf("Hello world") }
2014-08-31 00:48:14Hello worldができたので、次は変数。いきなり代入する場合は「変数名 := 値」 func main() { name := "Gopher" fmt.Printf("I'm %s", name) |
2014-08-31 00:54:17型がでてきたところで、次は関数。といってもmain関数の書き方が既に登場してるので引数と戻り値のあるケースを func moke(n string) string { return n + "さま!" }
2014-08-31 01:03:09引数の型や戻り値の型は、後ろに書きます。で、同じ型の引数はこんな感じでひとまとめにできます。 func moke(a, b, c string) { }
2014-08-31 01:05:18GoのクラスはC++風味。というか構造体。 type Programmer struct { Name string Language string }
2014-08-31 01:09:27structにメソッドを生やすには、funcの後にレシーバー書きます。 func (this *Programmer) write() { } レシーバーの変数名は何でもよくて、thisとかselfはあんまり使わないイメージ
2014-08-31 01:12:56メソッドはレシーバー付き関数なので、Javaのように1クラス1ファイルに意地になって書く といった必要は無いです。1メソッド1ファイルも可能っちゃ可能
2014-08-31 01:16:40「こんなメソッドもっていればOK」という意味では他の言語と同じ type UserAPI interface { Create(name string) User Get(id string) User }
2014-08-31 01:21:35Java / C# のように、明示的なimplementsは不要で、「シグネチャーが同じメソッドを全部もっていれば、そいつはそのinterfaceだ」という緩さ
2014-08-31 01:23:38fkm: 戻り値複数書けます。戻り値の型を()でまとめます func (j *Json) GetString(key string) (string, error) { } // err -> errorに修正
2014-08-31 01:43:27そして呼び側で変数errに代入してますが、これ、ifとかで使うコードが後ろに無いと「おい、err使ってねえぞ」とコンパイラに怒られます(エラー
2014-08-31 01:47:47これだと、errは必ずnilになるのが分かっている時に使いづらいので、「ここは使わない!」という時用に_という特殊変数が用意されてます name, _ := json.GetString("name")
2014-08-31 01:49:57継承とは違うけど、こんな面白いことできます。 type NewInt int func (i NewInt) Run() { fmt.Printf("I am NewInt") }
2014-08-31 01:59:02