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言語の可変長引数を徹底解説!実はスライスだった?スライスでの呼び出し方法も解説

Posted at

はじめに

Go言語で関数を設計する際に便利な可変長引数。複数の引数を柔軟に扱えるこの機能ですが、その実体はスライスであることをご存じでしょうか?本記事では、可変長引数の基本から、スライスを使った応用的な呼び出し方までを詳しく解説します。

可変長引数とは?

可変長引数は、関数に渡す引数の個数を動的に決定できる仕組みです。Go言語では、引数の型の前に...を付けることで可変長引数を宣言できます。以下の例を見てみましょう。

package main

import "fmt"

func sum(numbers ...int) int {
    total := 0
    for _, num := range numbers {
        total += num
    }
    return total
}

func main() {
    fmt.Println(sum(1, 2, 3))       // => 6
    fmt.Println(sum(10, 20, 30, 40)) // => 100
}

基本的な仕組み

  • 可変長引数は、複数の値を1つのスライスとして受け取ります。
  • 上記の例では、numbers[]int型のスライスとして扱われます。

実体はスライス!これが意味すること

Go言語の可変長引数の実体はスライスです。つまり、関数内で操作するときはスライスと同じ方法でアクセスできます。例えば以下のようなコードで確認できます。

package main

import "fmt"

func printDetails(values ...string) {
    fmt.Printf("Type: %T, Length: %d\n", values, len(values))
    for i, v := range values {
        fmt.Printf("Index %d: %s\n", i, v)
    }
}

func main() {
    printDetails("Go", "Python", "Ruby")
}

出力結果:

Type: []string, Length: 3
Index 0: Go
Index 1: Python
Index 2: Ruby

このように、可変長引数はスライスとして扱われるため、len関数やrangeを使用して操作できます。

スライスを使って可変長引数関数を呼び出す

可変長引数関数は、スライスを展開して引数として渡すことも可能です。その場合は、引数にスライスを渡す際に...を付けます。以下の例を見てみましょう。

package main

import "fmt"

func sum(numbers ...int) int {
    total := 0
    for _, num := range numbers {
        total += num
    }
    return total
}

func main() {
    nums := []int{10, 20, 30}
    fmt.Println(sum(nums...)) // => 60
}

注意点

  • ...を付けないと、スライス全体が1つの引数として渡されてしまいます。
  • nums...とすることで、スライスの要素が展開され、可変長引数として渡されます。

可変長引数を使うときのベストプラクティス

  1. 必要最低限の引数を分けて定義する
    必須の引数がある場合は、可変長引数の前に明示的に定義するとよいでしょう。
   func printMessages(header string, messages ...string) {
       fmt.Println(header)
       for _, msg := range messages {
           fmt.Println(msg)
       }
   }

   printMessages("Messages:", "Hello", "World")
  1. パフォーマンスに注意
    可変長引数のスライスは、新たに割り当てが行われるため、大量の引数を頻繁に渡す場合は注意が必要です。

おわりに

Go言語の可変長引数は、柔軟な引数管理を可能にする便利な機能です。しかし、その実体がスライスであることを理解することで、さらなる応用が可能になります。特に、スライスを展開して引数として渡す方法は非常に便利です。

この記事を参考に、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?