Go言語における関数の実践的な使い方

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

再帰関数を使用する際は、スタックオーバーフローを避けるため、適切な基底条件を設定する必要があります。

タグ: golang 関数 可変長引数 クロージャ 再帰

Sat, 09 May 2026 22:56:31 +0900 投稿