技術向上

プログラミングの学び、気になるテクノロジーやビジネストレンドを発信

関数【Go】

返り値なし

引数も取らない場合は次のようになります。

func p() {
    fmt.Println("printed.")
}

引数をとる場合は( )内に記載します。

func cal(x int, y int) {
    fmt.Println(x + y)
}

連続した引数が同じ型である場合、型の表記をまとめる事ができます。

func cal(x, y int) {
    fmt.Println(x + y)
}

関数を実行するときは次のようにします。

p()
cal(1, 2)


返り値あり

返り値の型も定義する事が必要です。

func add(x, y int) int {
    return x + y
}

返り値が複数ある場合は、( )で括ります。

func multi(x, y int) (string, int) {
    return "result is ", x * y
}

返り値に名前をつける事もできます。

func div(x, y float64) (result float64) {
    result = x / y
    return
}


次のように複数の返り値に名前をつけることもできます。
複数にする場合、全てに名前をつける必要があります。

func sub(x, y int) (mode string, result int) {
    result = x - y
    mode = "substraction"
    return mode, result
}


返り値が複数ある場合、名前をつけることによって、
その関数の冒頭を確認するだけで、どんな関数なのかイメージできるでしょう。

func cal(x, y int) (price, tax int) {
    .....
}


関数を実行するときは次のようにします。

a := add(1, 2)
b, c := multi(7, 6)
d := div(10, 3)
e, f := sub(5, 8)


次のように、特定の返り値を破棄することも可能です。

_, f := sub(5, 8)


無名関数、即時関数

関数内に関数を記述することもできます。

func main() {
    innerFunc := func(x, y int) {
        fmt.Println("innerFuncResult", x + y)
    }
    innerFunc(8, 5)
}

これを無名関数と呼びます。

上記の例だと、関数を変数に定義して、その後実行していますが、
次のように、即時実行させることもできます。

func main() {
    func(x, y int) {
        fmt.Println("innerFuncResult", x + y)
    }(8, 5)
}

このような関数を即時関数と呼びます。

もちろん、無名関数、即時関数どちらも、返り値を定義する事が可能です。

func main() {
    z := func(x, y int) int {
        return x * y
    }(8, 5)
    fmt.Println(z)
}