Go の可変個引数関数は、指定された型のスライスとして格納される可変数の引数を受け入れます。可変引数関数を呼び出すときは、引数がどのように渡されるかを理解することが重要です。
fmt.Fprintf の周囲にラッパーを作成しようとする次のコードを考えてみましょう。可変長引数を使用した場合:
func Die(format string, args ...interface{}) { str := fmt.Sprintf(format, args) fmt.Fprintf(os.Stderr, "%v\n", str) os.Exit(1) }
Die("foo") を呼び出すと、出力に予期しない "%%!(EXTRA []interface {}=[])" が含まれます。
この問題は、引数スライスを fmt.Sprintf に直接渡すことで発生します。引数を個別に正しく渡すには、省略記号演算子 ... を使用する必要があります:
package main import ( "fmt" "os" ) func Die(format string, args ...interface{}) { str := fmt.Sprintf(format, args...) fmt.Fprintf(os.Stderr, "%v\n", str) os.Exit(1) } func main() { Die("foo") }
... を使用すると、args スライスの各要素が個別の引数として fmt.Sprintf に渡され、問題が発生し、期待される出力が生成されます:
foo
以上がfmt.Fprintf ラッパーが予期しない出力を出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。