0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go言語で可変引数の関数にスライスを展開する方法

Last updated at Posted at 2024-05-13

Go言語において、可変引数の関数を扱う際、スライスを引数として、関数が可変数の引数を受け取る場合に非常に便利です。例えば、ログの出力、数値の集計、文字列の結合など、さまざまなシチュエーションで役立ちます。

可変引数の基本

まず、可変引数関数の基本から見ていきましょう。可変引数関数は、任意の数の引数を同じ型で受け取れる関数です。関数定義時には、パラメータの型の前に ... を置くことで、その型の任意の数の引数を受け取ることを示します。

例:以下の max 関数は、渡された整数の中から最大値を返します。

func max(values ...int) int {
	maxVal := values[0]
	for _, val := range values[1:] {
		if val > maxVal {
			maxVal = val
		}
	}
	return maxVal
}

スライスを可変引数に展開する

次に、あるスライスから条件に合う値のみを選び出し、それを max 関数に渡す例を見てみましょう。たとえば、10以上の値のみを選んで最大値を求めたい場合、以下のように書けます。

func filterAndProcess(threshold int, values ...int) int {
	var filtered []int
	for _, value := range values {
		if value >= threshold {
			filtered = append(filtered, value)
		}
	}
	return max(filtered...)
}

この関数 filterAndProcess は、まずスライス values から閾値 threshold 以上の値のみを選択して新たなスライスに格納します。そして、その結果得られたスライスを max 関数の可変引数に展開して渡し、最大値を求めて返します。

実行例

package main

import "fmt"

func max(values ...int) int {
	maxVal := values[0]
	for _, val := range values[1:] {
		if val > maxVal {
			maxVal = val
		}
	}
	return maxVal
}

func filterAndProcess(threshold int, values ...int) int {
	var filtered []int
	for _, value := range values {
		if value >= threshold {
			filtered = append(filtered, value)
		}
	}
	return max(filtered...)
}

func main() {
	values := []int{5, 10, 15, 20, 25, 3, 7}
	threshold := 10
	result := filterAndProcess(threshold, values...)
	fmt.Println(threshold, "より大きな数字", result)
}

この例では、values スライス内の10以上の値 {10, 15, 20, 25} を max 関数に渡しています。filterAndProcess 関数を通じて、max 関数がこのフィルターされたスライスから最大値を計算し、結果として25が出力されます。

下記に試してきます。
https://go.dev/play/p/8y8IfEwOK0M

最後

Go言語における可変引数とスライスの展開は、関数の柔軟性を高める重要な特徴です。この機能を活用することで、コードの再利用性を高め、さまざまなシチュエーションでの関数の適用性を向上させることができます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?