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

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

DDD
リリース: 2024-11-12 22:51:02
オリジナル
457 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート