Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
fmt.Sprintf() / Fprintf()
『fmt.Sprintf()』はフォーマットされた文字列を返す関数です。出力するのではなく文字列値として取得します。『fmt.Fprintf()』はio.Writerに書き出す関数で、ファイルや標準エラー出力への書き込みに使います。
構文
import (
"fmt"
"os"
)
// フォーマットされた文字列を返します(出力しません)。
s := fmt.Sprintf("書式文字列", 値1, 値2, ...)
// io.Writerにフォーマットして書き込みます。
n, err := fmt.Fprintf(writer, "書式文字列", 値1, 値2, ...)
// 標準エラー出力への書き込み(よく使うパターン)
fmt.Fprintf(os.Stderr, "エラー: %v\n", err)
// 改行なしの対応関数
s := fmt.Sprintf(...) // 文字列返却
fmt.Fprintln(w, ...) // io.Writerに改行付き出力
fmt.Fprint(w, ...) // io.Writerに改行なし出力
関数一覧
| 関数 | 概要 |
|---|---|
| fmt.Sprintf(format, a ...any) string | フォーマットされた文字列を返します。出力は行いません。 |
| fmt.Sprintf("%v", v) | 任意の値を文字列に変換する最も汎用的な方法です。 |
| fmt.Fprintf(w, format, a ...any) | io.Writerにフォーマットして書き込みます。書き込んだバイト数とエラーを返します。 |
| fmt.Fprintln(w, a ...any) | io.Writerに引数をスペース区切り・改行付きで書き込みます。 |
| fmt.Fprint(w, a ...any) | io.Writerに引数を書き込みます。 |
サンプルコード
package main
import (
"fmt"
"os"
"strings"
)
func main() {
// Sprintf:文字列を生成して変数に格納します。
name := "東京"
temp := 25.5
message := fmt.Sprintf("%sの気温は%.1f℃です。", name, temp)
fmt.Println(message)
// 動的に文字列を構築します。
items := []string{"リンゴ", "バナナ", "ミカン"}
var parts []string
for i, item := range items {
parts = append(parts, fmt.Sprintf("%d. %s", i+1, item))
}
fmt.Println(strings.Join(parts, "\n"))
fmt.Println()
// エラーメッセージの生成(fmt.Errorf との比較)
id := 404
errMsg := fmt.Sprintf("ID %d のリソースが見つかりません", id)
fmt.Println("エラー:", errMsg)
fmt.Println()
// Fprintf:io.Writerに書き込みます。
// 標準出力(os.Stdout)に書き込みます。
fmt.Fprintf(os.Stdout, "Fprintfで書き込み: %s\n", "テスト")
// strings.Builder を使って文字列バッファに書き込みます。
var sb strings.Builder
for i := 1; i <= 5; i++ {
fmt.Fprintf(&sb, "行%d\n", i)
}
fmt.Print(sb.String())
// 標準エラー出力への書き込み(エラーログに使います)
// fmt.Fprintf(os.Stderr, "エラー: %v\n", someError)
}
概要
『fmt.Sprintf()』は最も汎用的な文字列フォーマット関数です。任意の値を文字列化したい場合は『fmt.Sprintf("%v", 値)』が便利です。ただし、単純な文字列結合('+' 演算子や文字列リテラルへの直接追記)よりもオーバーヘッドがあるため、ホットパスでは『strings.Builder』の使用を検討してください。
ループ内で文字列を繰り返しSprintfして連結するのは非効率です。strings.Builderにfmt.Fprintfで逐次書き込む方法、またはstrings.Join()を使う方法がパフォーマンス上は有利です。
標準出力への出力は『fmt.Println() / Printf()』、フォーマット動詞の一覧は『フォーマット動詞』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。