ホームページ >バックエンド開発 >Golang >fmt.Fprintf ラッパーが予期しない出力を出力するのはなぜですか?

fmt.Fprintf ラッパーが予期しない出力を出力するのはなぜですか?

DDD
DDDオリジナル
2024-11-12 22:51:02431ブラウズ

Why Does My fmt.Fprintf Wrapper Print Unexpected Output?

可変引数関数に引数を渡す

Go の可変個引数関数は、指定された型のスライスとして格納される可変数の引数を受け入れます。可変引数関数を呼び出すときは、引数がどのように渡されるかを理解することが重要です。

問題: fmt.Fprintf ラッパーの余分な出力

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。