Python では、string.format を使用して文字列に値を挿入できます。次のようなプレースホルダーを使用します:
"File {file} had error {error}".format(file=myfile, error=err)
Go には、と呼ばれる同等の関数があります。 Sprintf は同様の方法で動作します:
fmt.Sprintf("File %s had error %s", myfile, err)
ただし、Sprintf には制限があります。書式文字列内のパラメーターの順序が引数の順序と一致する必要があります。これは、プレースホルダーの順序が言語によって異なる可能性がある国際化 (I18N) にとって問題となる可能性があります。
Go が提供するものtext/template と呼ばれる、Sprintf のより柔軟な代替手段。これにより、プレースホルダーの順序を指定する機能など、書式設定をより詳細に制御できるようになります。
package main import ( "bytes" "text/template" "os" ) func main() { type Params struct { File string Error string } var msg bytes.Buffer params := &Params{ File: "abc", Error: "def", } tmpl, _ := template.New("errmsg").Parse("File {{.File}} has error {{.Error}}") tmpl.Execute(&msg, params) msg.WriteTo(os.Stdout) }
このテンプレートベースのアプローチにより、文字列の書式設定をより柔軟に制御できるようになります。
文字列.Replacer type を使用して、カスタム名のプレースホルダーを許可するフォーマッタを実装できます。
package main import ( "fmt" "strings" ) func main() { file, err := "/data/test.txt", "file not found" log("File {file} had error {error}", "{file}", file, "{error}", err) } func log(format string, args ...string) { r := strings.NewReplacer(args...) fmt.Println(r.Replace(format)) }
このアプローチは単純で使いやすいです。
もう 1 つのオプションは、フォーマット文字列で明示的な引数インデックスを使用し、プレースホルダーを許可することです。複数回再利用する場合:
fmt.Printf("File %[1]s had error %[1]s", myfile, err)
このアプローチは、以前のアプローチほど汎用性は劣りますが、単純な場合には役立ちます。
以上がGo で Python の「string.format」に相当するものは何ですか?また、柔軟性と機能性の点でどのように比較されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。