Go言語基礎 その4 Go言語の基本構文2 (関数, init, 制御構文)

はじめに

前回の続きで Go 言語の文法をまとめておきたいと思います。

Go言語文法

関数

  • func を使用して定義
  • 連続する引数の型が同じ場合、最後の型以外省略可能
  • 複数の戻り値を返すことが可能
  • 複数の戻り値の一部を省略可能
func sum(a, b int) int {
    return a + b
}
sum(1 + 2) // == 3

// Multiple results
// 複数の戻り値を返すことが可能
// 同じ型の場合、最後の型以外省略可能
func combine(s1, s2 string) (string, int) {
    ret := s1 + s2
    return ret, len(ret)
}
// _ を使用して戻り値の一部を無視することが可能
_, len := combine("Bob", "Ross")

// Named return values
// var s string といったローカル変数定義を短縮できる
func bob() (s string) {
    s = "BobRoss"
    return
}

// 使用しない引数を _ で無視することが可能
func ross(_, _ string) {
    fmt.Println("Bob Ross")
}

// 関数の戻り値として関数を返すことも可能
func returnFunction() func() {
    return func() {
        fmt.Println("Returned function")
    }
}
f := returnFunction()
f()  // => "Returned function"

// 関数の引数として関数を渡すことも可能
func callFunction(f func()) {
    f()
}
callFunction(func() {
    fmt.Println("Called function")
})

// クロージャ
func increment() func() int {
    i := 0
    return func() int {
        i += 1
        return i
    }
}
incr := increment()
fmt.Println(incr()) // => "1"
fmt.Println(incr()) // => "2"
fmt.Println(incr()) // => "3"

init

  • パッケージの初期化を目的にした特殊な関数 func init() を定義することができる
  • パッケージ変数の初期化の後に呼ばれる
  • main パッケージ以外に定義された func init() は import されると呼び出される
func init() {
    fmt.Println("init")
}

制御構文

  • for
  • break
  • continue
  • if ~ else if ~ else
  • switch
  • fallthrough
for {
    /*無限ループ*/
    if a == 1 {
        break
    } else if b == 2 {
        continue
    }
}

for i := 0; i < 100; i++ {
    /* i が 0 ~ 99 まで繰り返し */
}

if v == 1 {
    // v が 1 の場合
} else if v == 2 {
    // v が 2 の場合
} else {
    // v が 1,2 以外の場合
}

// 簡易文付きif
if err := doSomething(); err != nil {
    fmt.Println("doSomething error")
}

この中でも switch は case 文に条件を書いたり、型で分岐ができたりいろんな形がある

switch n {
case 1, 2:
    fmt.Println("1 or 2")
case 3, 4:
    fmt.Println("3 or 4")
default:
    fmt.Println("unknown")
}

// fallthrough
switch n {
case 1, 2:
    fallthrough
case 3, 4:
    fmt.Println("1 or 2 or 3 or 4")
default:
    fmt.Println("unknown")
}

// 式を伴うcase
switch {
case n > 0 && n < 2:
  fmt.Println("0 < n < 2")
case 2 <= n && n < 4:
  fmt.Println("2 <= n < 4")
}

// 型によるswitch
switch x.(type) {
case bool:
    fmt.Println("bool")
case int, uint:
    fmt.Println("int")
case string:
    fmt.Println("string")
default:
    fmt.Println("unknown type")
}

参考にした本

おわりに

次回は Go 言語の文法の続きを復習したいと思います。