またしてもGo言語ネタです。
Go言語では以下のように関数定義できます。
func main() { println("test") }
この場合は引数なし、戻り値もなしです。
引数がある場合は以下のように書きます。
func test1(x int) { println(x) return; }
関数名の後の括弧の中に、変数名 型 のように書きます。
カンマ区切りで複数の引数も定義できます。
func test2(x int, y int) { println(x, y) return; }
次に戻り値がある場合を見ていきます。
test2と同じ引数で戻り値がintの関数の場合は以下のように書けます。
func test3(x int, y int) int { println(x, y) return x + y }
関数名の後ろの引数の括弧のあとに、戻り値の型を書きます。
この関数では引数2つの合計を返しています。
また、戻り値で複数の値を返すこともできます。
func test4(x int, y int) (int, int) { println(x, y) return y, x }
戻り値も括弧で囲んでカンマ区切りにすることで複数定義できます。
returnする際もカンマ区切りで値を返します。
他にも、可変引数も可能です。
func test5(x int, y int, n ... int) int { println(x, y) var sum = x + y for _, arg := range n { println(arg) sum += arg } return sum }
引数xとyは固定、それ以降は可変といったケースです。
可変の場合は変数名のあとに … を書きます。
この変数は配列としてアクセスして値を取り出すことができます。
この関数は以下のように呼び出すことができます。
_ = test5(1, 2) _ = test5(1, 2, 3) _ = test5(1, 2, 3, 4, 5, 6, 7, 8, 9) list := []int{ 3, 4, 5, 6 } _ = test5(1, 2, list ...)
可変引数は要素数0でも問題ありません。
また、配列の要素を展開して渡したい場合は配列の変数名のあとに … をつけることで展開できます。
これで引数や戻り値にはかなり慣れてきたかと思います。
最後に、引数には関数を渡すこともできます。
func test6(fn func(int, int, ... int) int) int { return fn(1, 2, 3, 4, 5) }
かなり複雑ですが、この関数の引数は1つ、戻り値はintです。
引数fnの型は「int型の引数2つとint型の可変引数をもち戻り値がintである関数」です。
つまりtest5のような関数です。
test6では、渡された関数に5つの引数を渡して実行しています。
呼び出す側では以下のように書きます。
ret := test6(test5)
変数retにはtest6の戻り値が入ります。
test6の戻り値はtest5に引数として1, 2, 3, 4, 5を渡して実行した結果となります。
ここまでくるとできることが増えてきますね。