関数で覚えておきたいGo言語の可変長引数・スライスも渡せます

Go言語
この記事は約5分で読めます。
Go初学者
Go初学者

Go言語では関数の引数を制限なく渡せる方法があるって聞いたんですが…本当ですか?

この記事ではGo言語の可変長引数について理解できます!
  • 関数で可変長引数をとる方法
  • 関数の引数としてスライスを渡す

Go言語では、関数の引数を制限なく受け取ることができる可変長引数というものがあります。

今回は、可変長引数を理解する前にGo言語の関数の基本も少しだけ復習しながら進めていきます。

もりぴ
もりぴ

関数の復習がいらない方はここからジャンプ!

Go言語の関数にちょっと不安がある方は、当ブログの記事を参考にしましょう。

もりぴ
この記事を書いた人

XHTML1.0時代にHTML&CSSを勉強した経験あり。無趣味だった私が2020年5月からプログラミング学習を開始し現在も挫折せずに趣味で学習を楽しんでいる51歳。プログラミングの楽しさをブログを通してお伝えしていきます。

もりぴをフォローする

Go言語の可変長引数を実際に使ってみよう!

Go言語の可変長引数を関数に使用して使って、実際の動きを確認してみましょう。

その前に基本的な関数を復習しましょう

Go言語の可変長引数を使用して関数を作成する前に、基本的な関数を復習していきます。

もりぴ
もりぴ

簡単に足し算のプログラムを作ってみましょう!

// 基本的な関数の復習
package main

import "fmt"

func add(num1, num2 int) int {
    return num1 + num2
}

func main() {
    n := add(1, 2)
    fmt.Println(n)
}
// 出力結果
$ go run main.go 
3

引数を2つ渡して足し算した関数で問題なく動いています。

もし引数を3つ渡したら、もちろんエラーになります。

// 出力結果
$ go run main.go 
# command-line-arguments
./main.go:30:10: too many arguments in call to add
        have (number, number, number)
        want (int, int)
もりぴ
もりぴ

エラーメッセージが実にわかりやすいですね。

さらに、引数を何も渡さなかったら…

// 出力結果
$ go run main.go 
# command-line-arguments
./main.go:30:10: not enough arguments in call to add
        have ()
        want (int, int)

もちろん同じようなエラーが出力されます。

ここまでを踏まえた上で、関数の引数に可変長引数を使ってみましょう。

関数の引数に可変長引数を使う

可変長引数の使用は下記の構成になります。

// 可変長引数

func 関数名(引数 ...型) {
    // 処理する内容
}

引数の型指定の前に ... を付け加えることで可変長引数になります。

では、実際にプログラムで動きを確認しましょう。

// 可変長引数
// 引数の数を指定しなくても関数に渡すことができる
package main

import "fmt"

func v(params ...int) {
    fmt.Println("要素数は", len(params), "受け取った値", params)
}

func main() {
    // 関数の実行
    v(1, 2, 3)
    v(1, 2, 3, 4, 5)
    v()
}
// 出力結果
要素数は 3 受け取った値 [1 2 3]
要素数は 5 受け取った値 [1 2 3 4 5]
要素数は 0 受け取った値 []

受け取った値は配列に収められています。

そして、引数が空でもエラーにならずに出力されていることが確認できます。

関数の引数としてスライスを渡す

関数の引数にスライスを渡してみましょう。

実際にプログラムで確認します。

// 可変長引数
// 関数の引数としてスライスを渡す
package main

import "fmt"

func v1(params ...string) {
	fmt.Println("要素数は", len(params), "受け取った値", params)
}

func main() {
    // スライスを作成しても渡せる
    sl := []string{"Golang", "PHP", "Python"}
    //ここ注意!スライス名のあとに ... を付ける
    v1(sl...)
}
// 出力結果
要素数は 3 受け取った値 [Golang PHP Python]

スライスも引数として渡すことができました。

スライスを渡す時は引数に スライス名... となります。

【参考】実は可変長引数を普段から使用していたんです…

もりぴ
もりぴ

可変長引数は普段から使用していたんです。

例えば fmt.Println() 関数は、可変長引数なんです。

// fmt.Println()  もカンマ区切りで引数をいくらでも渡せます
fmt.Println("Hello", "World", "!", "moripです。")

fmt.Println() 関数の引数も , 区切りでいくらでも記述でき、引数をきちんと出力してくれます。

Go言語の雑学程度に覚えておきましょう。

【まとめ】Go言語の可変長引数について

今回はGo言語の可変長引数についてお伝えしてきました。

それでは、まとめに入りましょう。

関数の引数として可変長引数を扱う時の構成

// 可変長引数
func 関数名(引数 ...型) {
    // 処理する内容
}
Go言語の可変長引数で知っておくこと!
  • 関数の引数に可変長引数にすることで、引数を制限なく渡すことができる
  • スライスを渡す時は引数に スライス名... にする
    関数名(スライス名...)

可変長引数自体は使用頻度は少ないと思います。

ただ、これから他の人のコードを見る際には覚えておかなければいけないでしょう。

... を見たら、可変長引数だな。

と理解しておきましょうね。

comment

タイトルとURLをコピーしました