golangの[] stringと…stringの違いは何ですか?


85

Go言語では、

[]string 文字列配列です

また...string、パラメータとしても使用します。

違いはなんですか?

関数の定義:

func f(args ...string) {}

この関数を次のように呼び出すことはできますか?

args := []string{"a", "b"}

f(args)

回答:


126

[]string 文字列配列です

技術的には、基になる配列を参照するスライスです

また...string、パラメータとしても使用します。

違いはなんですか?

構造に関しては、実際には何もありません。両方の構文から得られるデータ型は同じです。

...パラメータの構文は、可変長のパラメータになります。0個以上のstring引数を受け入れ、それらをスライスとして参照します。

の呼び出しに関してfは、次の構文で文字列のスライスを可変個引数パラメータに渡すことができます。

func f(args ...string) {
    fmt.Println(len(args))
}


args := []string{"a", "b"}

f(args...)

この構文は、リテラル構文を使用して作成されたスライス、または可変個引数パラメーターを表すスライスのいずれかで使用できます(これらの間に実際には違いがないため)

http://play.golang.org/p/QWmzgIWpF8


10
[]stringはスライスであり、配列ではありません。配列とスライスの違いは微妙ですが重要です。
スティーブンワインバーグ

@StephenWeinberg:はい、「違いは何ですか」という引用に対する私の「本当に何もない」答えは、可変個引数関数パラメーターによって生成されたスライスと[]string構文を使用して作成されたスライスの違いについて尋ねられた質問に答えています。わかりやすくするために、回答に引用を追加します。:-)
私は怠惰な

@IHateLazy組み込みprintlnを省略記号で機能させる方法はありますか?ここに私の実験があります。誰かがデバッグ印刷機能を希望する場合は、私のプレイグラウンドを見てください。
ボールト

14

どちらも文字列の配列を作成しますが、違いはその呼び出し方法にあります。

func f(args ...string) {

}
// Would be called like this:

f("foo","bar","baz");

これにより、可変数の引数(すべて同じタイプ)を受け入れることができます。

この良い例はfmt.Print、友達です。友達は、必要な数のアルグメントを受け入れることができます。


私はGoの専門家ではありませんが、1つの可変個引数ともう1つの配列引数ではなく、他の言語のように2つは区別されませんか?
軌道上のライトネスレース2012年

1
@LightnessRacesinOrbitうん。それが明確でない場合は、混乱して申し訳ありません。両方の配列の作成に関する最初の行は、両方のインスタンスで結果として得られる引数が配列であることを意味します。これは、Pythonのdef fn(*args)構造とほぼ同じです。
tylerl 2012年

では、Goは可変引数を配列型のインスタンスとして公開しますか?それは喜ばしいことです。
軌道上でのライトネスレース2012年

実際には、どちらも配列ではなく文字列のスライスを作成します。それらはgolangでは異なるものです。
PointerToConstantChar 2017

どちらも文字列の「配列」を作成するのではなく、文字列の「スライス」を作成します。
Inanc Gumus 2017


1

それはあなたの関数パラメータを単純化します。次に例を示します(https://play.golang.org/p/euMuy6IvaM):メソッドSampleEllipsisは、同じタイプのゼロから多数のパラメーターを受け入れますが、メソッドSampleArrayでは、必須の引数を宣言する必要があります。

package main

import "fmt"

func SampleEllipsis(args ...string) {
    fmt.Printf("Sample ellipsis : %+v\n",args)
}


func SampleArray(args []string) {
    fmt.Println("Sample array ")
    SampleEllipsis(args...)
}

func main() {
    // Method one
    SampleEllipsis([]string{"A", "B", "C"}...)
    // Method two
    SampleEllipsis("A", "B", "C")
    // Method three
    SampleEllipsis()

    // Simple array
    SampleArray([]string{"A", "B", "C"})

    // Simple array
    SampleArray([]string{})

}

戻り値 :

Sample ellipsis : [A B C]
Sample ellipsis : [A B C]
Sample ellipsis : []
Sample array 
Sample ellipsis : [A B C]
Sample array 
Sample ellipsis : []
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.