返り値なし
引数も取らない場合は次のようになります。
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) }