GO入門
今回はgolang入門です。
Goはなんか速いみたいだし、ライブラリも増えてきてnode.jsとかと組み合わせて使うユースケースがあるみたいで気にはなっていました。今回は変数の定義とかmain関数とかやります。
1 |
func ServeHTTP(w http.ResponseWriter, r *http.Request) { |
2 |
var text string |
3 |
text = "Hello, World" |
4 |
w.Write([]byte(text)) |
5 |
} |
上の処理だと、ServerHTTPというメソッドの引数にwやrといった引数が指定されています。
変数を指定するときはvar [変数名] stringという形で表現します。Webサーバ上にテキストを書きたいときは、ResponseWriter型のWriter()を使います。
1 |
func GetNumber() (n int) { |
2 |
n = 10 |
3 |
return // return n や return 10と書いても問題ありません。 |
4 |
} |
返り値は複数指定することができ、上記のようにreturnとだけ書くこともできる。なお、下記のような1つ目の返り値が関数の結果、2つ目の返り値はエラーが発生したかどうかを表すというコードがよく登場します。
1 |
result, err := something() |
返り値は型も独特なものが多数あります。
- int8, int16, uint8など
- String, rune, func, structなど
Goの型システムは非常に厳密であり、異なる型の変数同士の直接代入はできず、他の言語のように暗黙の型変換もありません。そのため、以下はエラーになります。
1 |
var a int |
2 |
var b float |
3 |
b = 10.0 |
4 |
a = b // エラー |
どうしても値を代入したい場合、明示的な型変換が必要です。
1 |
var a int |
2 |
var b float |
3 |
b = 10.0 |
4 |
a = int(b) // 成功、aに10が入る |
このように厳密な型システムを持つことで、ビルド時に多数のミスをより多く見つけることが可能になります。また、型推論を持つことでコード量が少なくて済みます。
1 |
var text string |
2 |
text = "Hello, World" |
例えば、上の2行の例は下記のように書き直せます。
1 |
text := "Hello, World" |
Goのコンパイラは、「"Hello, World"という文字列を入れているので、このtextという変数はstring型だ」と判断し、プログラマが何も書かなくてもtext変数をstring型として扱ってくれます。
1 |
text := "Hello, World" |
2 |
text = 100 // エラー |
int型配列の初期化を行う場合は,以下のように書きます。
1 |
numbers := [3]int{1,2,3} |
要素数も「型」の一部であるので注意が必要です。そのため、「[3]int」と「[5]int」は全く別の型として扱われます。
分岐条件を丸括弧で囲わないところが特徴的です。また、以下のように分岐条件の前に代入文を分けて書くこともできます。
1 |
if err := foo() ; err != nil { |
2 |
// エラー処理 |
3 |
} |
変数への代入と、それを使った判定を一度に書けるのは他の言語でもできますが、文の終端を意味するセミコロンを間に挟んで、2つの式をまとめて書くことができるというのはGoならではです。