2017-08-19 2 views
1

への引数として配列を開梱、私はこのコードの出力は文字列配列を解凍し、path.JoinGoはpath.Join

package main 

import (
    "fmt" 
    "path" 
) 

func main() { 
    p := []string{"a", "b", "c"} 
    fmt.Println(path.Join(p...)) 
} 

を渡したい:

しかし、私は次のように引数を渡す場合:

package main 

import (
    "fmt" 
    "path" 
) 

func main() { 
    p := []string{"a", "b", "c"} 
    fmt.Println(path.Join("d", p...)) 
} 

これは機能しません。

tmp/sandbox299218161/main.go:10: too many arguments in call to path.Join 
    have (string, []string...) 
    want (...string) 

私はアンパックを誤解していると思いますか?

答えて

4

本当に何かを誤解しているわけではありません。 specは言う:

最後の引数は、スライスタイプ[]Tに割り当てている場合は、引数が...が続いているならば、それは...Tパラメータの値としてそのまま渡すことができます。この場合、新しいスライスは作成されません。要するに

あなたがそれを行うとき、それは単に代わりに新しいを作成するのは、関数内のパラメータスライスとしてp-用途を再度ので、p...は、引数の全体可変引数一部としてのみを使用することができます1。

あなたが最初にいくつかの引数を追加したい場合は、あなたが最初にすべての引数を使用して独自のスライスを構築しなければならない、のようなもの:大丈夫、版画「D /作品

p := []string{"a", "b", "c"} 
p2 := append([]string{"d"}, p...) 
fmt.Println(path.Join(p2...)) 

/紀元前"。