Goalist Developers Blog

Go言語の構文

こんにちは。
暇な時に、経験がないことを触ってみたいと思いましたから、Go言語の勉強を始めました。
まず、Go言語の構文について紹介させていただきます。

1. パッケージ

Goのプログラムは、パッケージで構成されます。
書いているパッケージに、括弧で他のパッケージのインポートをグループ化し、factoredインポートステートメント( factored import statement )と言うことはできます。

package main

import (
    "fmt"
    "math"
)

func main() {
    fmt.Println(math.Pi)
}

2. 関数

Go言語で、関数のキーワードはfuncです。
関数は、0個以上の引数を取ることができます。
型名は変数名の後ろに書かれます。
関数は複数の戻り値を返すことができます。

package main

import "fmt"

func addAndSub(x, y int) (int, int) {
    return x + y, y-x
}

func main() {
    fmt.Println(addAndSub(5, 10))
}

上記のプログラムの出力結果は 15 5です。

3. 変数

Go言語で、変数を宣言するためのキーワードはvarです。
関数の中では、 var 宣言の代わりに、短い:= の代入文を使えます。
なお、関数の外では、キーワードではじまる宣言(var, func, など)が必要で、 := での暗黙的な宣言は利用できません。

package main

import "fmt"
var i, j int = 1, 2
func main() {
    k := 3
    fmt.Println(i, j, k)
}

上記のプログラムの出力結果は 1 2 3です。

4. Forループ

Go言語で、for ステートメントの3つの部分を括る括弧 ( ) はありません。
初期化ステートメントと後処理ステートメントがない場合、他の言語(JavaやPHPなど)のwhile ステートメントとして使えます。

package main

import "fmt"

func main() {
 
    for i := 0; i < 10; i++ {
        fmt.Println(i)
    }
 
    check:= false
    for !check {
        fmt.Println("Hello World")
        check = true;
    }
}

5. Ifステートメント

Go言語で、if ステートメントは、先ほどの for ループと同様に、括弧 ( ) は不要で、中括弧 { } は必要です。

package main

import (
    "fmt"
)

func signOfNum(x int) string {
    if (x > 0) {
        return "positive"
    } else if (x < 0) {
        return "negative"
    } else {
        return "zero"
    }
}

func main() {
    fmt.Println(signOfNum(2))
}

6. Switchステートメント

Go言語で、switch は他の言語(JavaやPHPなど)の switch と似ていますが、下記に重要な2つの違いことはあります。

  • 選択された case だけを実行してそれに続く全ての case は実行されません。 他の言語(JavaやPHPなど)の case の最後に必要な break ステートメントが Go では自動的に提供されます。
  • switchcase は定数である必要はなく、 関係する値は整数である必要もありません。
package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("When's Saturday?")
    today := time.Now().Weekday()
    switch time.Saturday {
    case today + 0:
        fmt.Println("Today.")
    case today + 1:
        fmt.Println("Tomorrow.")
    case today + 2:
        fmt.Println("In two days.")
    default:
        fmt.Println("Too far away.")
    }
}

Go言語で、switch条件のないswitchは、switch true と書くことと同じです。

package main

import (
    "fmt"
    "time"
)

func main() {
    t := time.Now()
    switch {
    case t.Hour() < 12:
        fmt.Println("Good morning!")
    case t.Hour() < 17:
        fmt.Println("Good afternoon.")
    default:
        fmt.Println("Good evening.")
    }
}

7. Deferステートメント

Go言語で、defer へ渡した関数の引数は、すぐに評価されますが、その関数自体は呼び出し元の関数がreturnするまで実行されません。

defer へ渡した関数が複数ある場合、その呼び出しはスタックされます。 呼び出し元の関数がreturnするとき、 defer へ渡した関数は LIFO(last-in-first-out) の順番で実行されます。

package main

import "fmt"

func main() {
    count:=0;
    for i := 0; i < 3; i++ {
        count++;
        defer fmt.Println(count)   
    }
    fmt.Println("done")
    fmt.Println(count)
}

上記のプログラムの出力結果は:

done
3
3
2
1

参考書類

今回の記事でGoの構文について少し紹介しました。
詳しい情報は下記のリンクにご参考ください。