Go練習問題3-03:関数の可変長引数を理解しよう

記事内に商品プロモーションを含む場合があります

Go言語の初心者向け問題3-3:関数の可変長引数を理解しよう

この問題を解くために必要な知識:
レベル1~2の知識関数の定義と呼び出し関数の戻り値と複数の戻り値関数の可変長引数無名関数(匿名関数)クロージャ構造体の定義とコンストラクタ関数構造体の埋め込みメソッドの定義とレシーバインターフェース型アサーション型スイッチ

<<前の問題 問題集Top 次の問題>>

Go言語の文法「関数の可変長引数」とは





ここでは関数の可変長引数の意味や使い方を復習します。必要ない方はここをクリックして練習問題へ飛びましょう。

Go言語では、関数に可変長引数を使用することができます。可変長引数とは、関数が任意の数の引数を受け取ることができる機能のことです。

これにより、関数を柔軟に定義し、呼び出し時に異なる数の引数を渡すことが可能になります。

可変長引数の基本的な使い方

Go言語では、関数の最後の引数として「...」を使うことで、可変長引数を定義できます。この記号を使うと、その引数はスライスとして扱われ、複数の値を渡すことができます。

例えば、複数の整数を加算する関数を以下のように定義することができます。

package main

import "fmt"

// 可変長引数を持つ関数
func sum(nums ...int) int {
    total := 0
    for _, num := range nums {
        total += num
    }
    return total
}

func main() {
    fmt.Println(sum(1, 2, 3))       // 出力: 6
    fmt.Println(sum(4, 5, 6, 7, 8)) // 出力: 30
}

説明

  1. sum関数は、可変長引数として nums ...int を受け取ります。ここで ...int は整数のリストを受け取ることを意味します。
  2. 関数内で nums はスライスとして扱われ、通常のスライスのように操作できます。
  3. main関数では、sum関数に異なる数の引数を渡しても正しく計算されることが確認できます。

実用例

可変長引数は、関数に複数のデータを渡す必要がある場合や、オプションの引数を扱う場合に便利です。たとえば、複数のメッセージを一度にログに記録する場合などに役立ちます。

package main

import "fmt"

func log(messages ...string) {
    for _, message := range messages {
        fmt.Println(message)
    }
}

func main() {
    log("Starting application")
    log("Application started", "No errors detected")
}

このコードでは、log関数に任意の数のメッセージを渡して表示することができます。

まとめ

Go言語の可変長引数を使用することで、関数の柔軟性が増し、異なる数の引数を受け取る関数を簡単に定義できます。

初めてGo言語を学ぶ際には、この機能を理解して、コードをより簡潔に書けるようにしましょう。

Go練習問題3-3:複数の数を合計するプログラムを作ろう

複数の整数を受け取り、その合計を計算するプログラムを作成しましょう。この問題では、可変長引数を使った関数の作成方法を学びます。

この問題の要件

以下の要件に従ってコードを完成させてください。

  • sum という名前の関数を作成し、可変長引数として複数の整数を受け取ること。
  • 受け取った整数をすべて合計し、その結果を返すこと。
  • 作成した sum 関数を使って、複数の整数の合計を計算し、結果を fmt.Println で表示すること。

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

合計は: 6
合計は: 150

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1.パッケージの宣言
2.import文の使用
3.main関数の定義
 3-1.sum関数の定義と呼び出し
  3-1-1.可変長引数を使用するための関数の定義
  3-1-2.変数totalを初期化
  3-1-3.可変長引数のスライスをrangeで繰り返し処理し合計を計算
  3-1-4.合計値を返す
 3-2.sum関数を呼び出し、複数の整数を合計して出力

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

package main

import "fmt"

// 関数sumは、可変長引数として任意の数の整数を受け取り、その合計を計算する
func sum(nums ...int) int {
    /* 【穴埋め問題1】
    ここで合計を保存する変数totalを初期化するコードを書いてください。
    */
    
    // 可変長引数のスライスをrangeで繰り返し処理
    for _, num := range nums {
        /* 【穴埋め問題2】
        ここで各整数を合計に加算するコードを書いてください。
        */
    }
    /* 【穴埋め問題3】
    ここで計算された合計を返すコードを書いてください。
    */
}

func main() {
    // sum関数を使って複数の整数を加算し、その結果を表示する
    fmt.Println("合計は:", sum(1, 2, 3))           // 出力: 合計は: 6
    fmt.Println("合計は:", sum(10, 20, 30, 40, 50)) // 出力: 合計は: 150
}

 

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

解答例と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

package main

import "fmt"

// 関数sumは、可変長引数として任意の数の整数を受け取り、その合計を計算する
func sum(nums ...int) int {
    // 合計を保存する変数totalを初期化
    total := 0
    // 可変長引数はスライスとして扱われるため、rangeを使って繰り返し処理
    for _, num := range nums {
        total += num // 各整数を合計に加算
    }
    return total // 計算された合計を返す
}

func main() {
    // sum関数を使って複数の整数を加算し、その結果を表示する
    fmt.Println("合計は:", sum(1, 2, 3))           // 出力: 合計は: 6
    fmt.Println("合計は:", sum(10, 20, 30, 40, 50)) // 出力: 合計は: 150
}

正解コードの解説

以下に、先ほど生成したGoのコードを初心者向けに解説します。この解説では、コードをブロックごとに分割し、それぞれの文法や機能について説明します。特に、「関数の可変長引数」の部分を強調して解説します。

パッケージの宣言とimport文の使用

package main

import "fmt"
  • package main: Goプログラムのエントリーポイントを定義するパッケージです。このパッケージは、Go言語で独立して実行可能なプログラムを作成する際に必ず使用します。
  • import "fmt": fmtパッケージは、標準入力や出力を扱うために必要です。例えば、文字列や変数を出力するための fmt.Println 関数を使用できます。

sum関数の定義

func sum(nums ...int) int {
    total := 0
    for _, num := range nums {
        total += num
    }
    return total
}
  • func sum(nums ...int) int: ここで重要な「関数の可変長引数」が使われています。nums ...int の部分は、任意の数の整数を受け取ることができることを意味します。この引数は、関数呼び出し時にいくつでも整数を渡すことができ、これらの引数はスライスとして扱われます。
  • total := 0: 合計を保存するための変数 total を初期化します。
  • for _, num := range nums: nums に含まれるすべての整数を順番に取り出し、それぞれを total に加算していきます。この range 構文を使うことで、スライス内の要素を1つずつ処理できます。
  • return total: 最終的に計算された合計値を関数の呼び出し元に返します。

main関数の定義

func main() {
    fmt.Println("合計は:", sum(1, 2, 3))           // 出力: 合計は: 6
    fmt.Println("合計は:", sum(10, 20, 30, 40, 50)) // 出力: 合計は: 150
}
  • func main(): Goプログラムのエントリーポイントです。この main 関数が実行されることでプログラムが動作します。
  • fmt.Println: 標準出力にメッセージを表示する関数です。ここでは、sum 関数で計算された合計値を日本語のメッセージと共に表示します。
  • sum(1, 2, 3)sum(10, 20, 30, 40, 50): sum 関数を呼び出し、可変長引数として複数の整数を渡しています。それぞれの呼び出しで異なる数の引数を渡していますが、sum 関数はそれらを正しく処理し、合計を計算して返します。

まとめ

このコードでは、Go言語の「関数の可変長引数」を使って、複数の整数を合計する方法を学びました。

可変長引数を使うことで、関数に渡す引数の数を柔軟に変更でき、再利用性の高い関数を作成できます。​

<<前の問題 問題集Top 次の問題>>

この問題への質問・コメント

この問題を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Go練習問題集へ戻る
    トップページへ戻る