1. 可変長引数関数
Go言語では、引数の前に省略符号(...)を付けることで、任意の数の引数を受け取る関数を定義できます。
package main
import "fmt"
// 複数の文字列を受け取り、結合して出力する関数
func concat(elements ...string) {
result := ""
for _, elem := range elements {
result += elem + ","
}
fmt.Println(result)
}
func main() {
// 通常の呼び出し方法
concat("apple", "banana")
concat("dog", "cat", "bird")
// スライスに展開して渡すことも可能
fruits := []string{"peach", "melon", "grape"}
concat(fruits...)
}
実行結果:
apple,banana,
dog,cat,bird,
peach,melon,grape,
2. 無名関数とクロージャ
関数は変数に代入したり、他の関数の返り値として返したりすることができます。返された関数は、外側の変数を参照し続けるクロージャとして機能します。
package main
import "fmt"
// カウンターを生成する関数
func createCounter() func() int {
count := 0
return func() int {
count++
return count
}
}
func main() {
// 最初のカウンター
counterA := createCounter()
fmt.Printf("カウンターA: %d\n", counterA())
fmt.Printf("カウンターA: %d\n", counterA())
fmt.Printf("カウンターA: %d\n", counterA())
// 独立した второй カウンター
counterB := createCounter()
fmt.Printf("カウンターB: %d\n", counterB())
fmt.Printf("カウンターB: %d\n", counterB())
}
実行結果:
カウンターA: 1
カウンターA: 2
カウンターA: 3
カウンターB: 1
カウンターB: 2
3. 再帰関数
関数は自身を呼び出すことができ、これを再帰と呼びます。終了条件を明確に定義することが重要です。
package main
import "fmt"
// フィボナacci数列のn番目の値を計算
func fibonacci(n int) int {
if n <= 1 {
return n
}
return fibonacci(n-1) + fibonacci(n-2)
}
func main() {
// 0から9までのフィボナacci数を表示
for i := 0; i < 10; i++ {
fmt.Printf("%d ", fibonacci(i))
}
fmt.Println()
}
実行結果:
0 1 1 2 3 5 8 13 21 34
再帰関数を使用する際は、スタックオーバーフローを避けるため、適切な基底条件を設定する必要があります。