Go の[]String と...String の違い

Jay Singh 2023年1月30日
  1. Go で []string を使用してスライスを定義する
  2. Go で ...string を使用して可変個引数関数を定義する
  3. Go で []string...string の両方を使用する
Go の[]String と...String の違い

配列セクションはスライスと呼ばれます。スライスは、アレイよりも強力で柔軟性があり、便利です。

スライスはインデックス付け可能で、配列と同じように長さがあります。配列とは異なり、それらは拡張できます。

スライスは、配列の連続したセクションを定義するデータ構造であり、スライス変数とは別に保持されます。

配列はスライスと同じではありません。配列のスライスはそのサブセットです。

この記事では、Go の []string...string の違いについて説明します。

Go で []string を使用してスライスを定義する

この例では、for コマンドと range コマンドを使用して、単語のセットを反復処理しました。

package main

import "fmt"

func main() {
    words := []string{"Iron Man", "Thor", "Hulk", "Dr Strange", "Spiderman"}
    for idx, word := range words {
        fmt.Println(idx, word)
    }
}

出力:

0 Iron Man
1 Thor
2 Hulk
3 Dr Strange
4 Spiderman

Go で ...string を使用して可変個引数関数を定義する

パラメータの前の省略記号(...)は、可変個引数関数を定義します。関数に提供されているアベンジャーズの名前に応答するプログラムを作成しましょう。

1つのパラメーターnames を受け入れる sayHello メソッドを設計しました。データ型 ...string の前に省略記号(...)を追加したため、引数は変数です。

Go は、関数が 0、1、または多くのパラメーターを取ることができることを理解しています。

names パラメータは、スライスとして sayHello メソッドに送信されます。データ型は文字列であるため、names パラメータは文字列のスライス([]string)のようにメソッド本体内で処理できます。

range 演算子を使用して、文字列のスライス全体を反復するループを構築できます。

package main

import "fmt"

func main() {
    sayHello()
    sayHello("Iron Man")
    sayHello("Thor", "Hulk", "Dr Strange", "Spiderman")
}

func sayHello(names ...string) {
    for _, n := range names {
        fmt.Printf("Hello %s\n", n)
}

出力:

Hello Iron Man
Hello Thor
Hello Hulk
Hello Dr Strange
Hello Spiderman

Go で []string...string の両方を使用する

package main

import "fmt"

func f(args ...string) {
    fmt.Println(len(args))
    for i, s := range args {
        fmt.Println(i, s)
    }
}

func main() {
    args := []string{"Hello", "Jay"}
    f(args...)
}

出力:

2
0 Hello
1 Jay

関連記事 - Go Slice

関連記事 - Go Variadic