tixture55’s diary

主にプログラミング関係の日記です。

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つ目の返り値はエラーが発生したかどうかを表すというコードがよく登場します。

リスト11:よく使われる返り値の書き方

1 result, err := something()

 

返り値は型も独特なものが多数あります。

  • int8, int16, uint8など
  • String, rune, func, structなど

Goの型システムは非常に厳密であり、異なる型の変数同士の直接代入はできず、他の言語のように暗黙の型変換もありません。そのため、以下はエラーになります。

リスト15:Goでエラーとなる代入の例

1 var a int
2 var b float
3 b = 10.0
4 a = b  // エラー

 どうしても値を代入したい場合、明示的な型変換が必要です。

リスト17:キャスト

1 var a int
2 var b float
3 b = 10.0
4 a = int(b)  // 成功、aに10が入る

 

このように厳密な型システムを持つことで、ビルド時に多数のミスをより多く見つけることが可能になります。また、型推論を持つことでコード量が少なくて済みます。

リスト18:変数宣言の例

1 var text string
2 text = "Hello, World"

 

例えば、上の2行の例は下記のように書き直せます。

 

リスト19:型推論を利用して記述方法

1 text := "Hello, World"

 

Goのコンパイラは、「"Hello, World"という文字列を入れているので、このtextという変数はstring型だ」と判断し、プログラマが何も書かなくてもtext変数をstring型として扱ってくれます。

リスト20:型推論と異なる型への代入はエラー

1 text := "Hello, World"
2 text = 100  // エラー

 

int型配列の初期化を行う場合は,以下のように書きます。

リスト22:int型配列の初期化

1 numbers := [3]int{1,2,3}

素数も「型」の一部であるので注意が必要です。そのため、「[3]int」と「[5]int」は全く別の型として扱われます。

 

分岐条件を丸括弧で囲わないところが特徴的です。また、以下のように分岐条件の前に代入文を分けて書くこともできます。

1 if err := foo() ; err != nil {
2   // エラー処理
3 }

変数への代入と、それを使った判定を一度に書けるのは他の言語でもできますが、文の終端を意味するセミコロンを間に挟んで、2つの式をまとめて書くことができるというのはGoならではです。