golang 可変長引数とは 引数の(...)の使い方
今回はgolangにおける可変長引数について解説していきます。
可変長引数とは
可変長引数はその名の通り、引数の数を可変に定義することができます。
例えば以下のようなコードの場合、x()関数はint型の2つの引数を渡す必要があるため、x(1, 2, 3)と書いたらエラーになります。
func x(a, b int) {
}
func main() {
x(1, 2)
x(1, 2, 3)
}
これを可変長引数を使い、引数の数の制限を取っ払うことができます。
以下のコードのように引数の型指定の前に「...」をつけることで可変長引数にすることができます。
func x(...int) {
}
func main() {
x(1, 2)
x(1, 2, 3)
}
可変長引数の使い方
可変長引数を使うタイミングとして最も多いのはスライスの要素を関数に引数で渡したいときです。
スライスは長さが可変であるためデータによってはその長さが異なり、要素数も変わってきます。
例えば以下のようにスライスaは現在は長さ3ですが、処理によってはこれが増えたり減ったりする可能性があります。
func x(params ...int) {
for _, param := range params {
fmt.Println(param)
}
}
func main() {
a := []int{1, 2, 3}
x(a...)
}
こういったものに対応すべく可変長引数を使うことがあるので抑えておきましょう。
golangの案件を探すならクラウドワークス テック
可変長引数の注意点
可変長引数は便利な反面注意点もいくつかあります。
最後の引数のみ可変長
可変長引数は関数の引数において最後の引数でのみ使用することができます。
関数が可変長の引数リストをどこで終了するかを判断するために必要となります。
同一型の引数のみ受け入れる
可変長引数は同一の型の値のみ使用することができます。異なる型の値を同時に受け入れることはできないので注意が必要です。
スライスとして扱われる
関数では可変長引数は同じ型のスライスとして扱われます。
そのため可変長引数に対してはスライスの操作を行うことが可能となります。
nilとして扱われる可能性
引数がない状態で可変長引数関数を呼び出すと、可変長引数はnilスライスとして扱われます。
空のスライスとnilスライスとでは挙動に違いがあるので要注意です。
golangをもっと詳しくなりたい方に
初めてのGo言語
Go言語の入門から応用まではこの一冊で網羅されています。説明も順序立てて説明されており完成度の高い参考書となっています。
詳解Go言語Webアプリケーション開発
こちらはGo言語の基礎知識を得たあとに読むことをすすめる本となっています。ハンズオン形式で手を動かしながら実装をしていくことができるため、実際の開発を意識しながらGo言語を学ぶことができます。
以下の記事では他にも筆者が実際に読んでおすすめしたい本をまとめています。
【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)
まだGo言語の勉強を始めていない方、全くの初心者の方にはこちらのUdemy教材が最もおすすめです。
この教材ではgolangの基礎について網羅的に学ぶことができます。ただ見て学ぶだけでなく、講座の中でアプリ作成まで行うことで学んだことの理解をさらに深めることができます。
現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発
個人的に最も勉強になったのは「現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発」という教材です。
本格的なレクチャーに入る前に、なぜGoなのか、なぜFintechなのかについて説明されていることで、Goの概念や意味について大枠から理解することができます。
以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。