入出力

Go言語のPrintf書式について解説

Go言語のprintf関数は、出力内容を柔軟にフォーマットするための便利なツールです。

この記事では、%d%s%fなどの主要な書式を中心に、具体的な使い方をわかりやすく説明します。

コードを実際に動かしながら、出力結果を確認できる内容です。

Printf関数の基本

Printf関数は、フォーマットされた文字列を生成して標準出力に出力するために利用されます。

出力内容やフォーマットの指定には、あらかじめ定義された書式指定子を使用します。

以下では、基本的な構文や書式指定子の使い方を簡単なサンプルコードを交えて説明します。

基本構文と書式指定子の概要

Printf関数の基本構文は、以下のようになります。

fmt.Printf(書式文字列, 値1, 値2, …)

書式文字列の中に含まれる書式指定子(例: %d, %sなど)は、対応する値と連動して出力内容を決定します。

たとえば、整数型の値を出力する場合は%d、文字列なら%sを使用します。

サンプルコードをご覧ください。

package main
import (
	"fmt"
)
func main() {
	// 整数と文字列の出力例
	num := 42          // 整数のサンプル値
	text := "サンプル" // 文字列のサンプル値
	// %dは整数、%sは文字列に対応
	fmt.Printf("数値: %d, 文字列: %s\n", num, text)
}
数値: 42, 文字列: サンプル

出力結果の確認方法

Printf関数を使った後は、実行結果として標準出力に表示される文字列を確認します。

実行環境でプログラムを走らせると、出力結果がコンソール上に表示されるため、書式指定子の動作や整形が正しいかどうかをすぐに確認できる仕組みになっています。

複数の値を様々な書式で出力してみることで、書式指定子の振る舞いを具体的に把握できます。

整数型の書式指定子

整数型の値を表示する際には、基数(10進数、8進数、16進数など)に応じた書式指定子を使用します。

ここでは、10進数表示の基本や、8進数、16進数の利用例を紹介します。

10進数(%d)の利用例

10進数で数値を表示する場合は、書式指定子%dを使用します。

以下のサンプルコードでは、整数値を10進数で出力しています。

package main
import (
	"fmt"
)
func main() {
	// 10進数の整数を出力する例
	number := 123
	// %dで10進数表記
	fmt.Printf("10進数: %d\n", number)
}
10進数: 123

8進数(%o)と16進数(%x)の利用例

8進数と16進数で数値を出力するには、それぞれ%o%xを使用します。

下記のサンプルコードは、同じ整数値を8進数と16進数で出力する例です。

package main
import (
	"fmt"
)
func main() {
	// 8進数と16進数に変換する例
	number := 123
	// %oは8進数、%xは16進数の小文字表記
	fmt.Printf("8進数: %o\n", number)
	fmt.Printf("16進数: %x\n", number)
}
8進数: 173
16進数: 7b

補助的な整数書式指定子の活用

整数型を出力する際には、符号の表示や空白でのパディングなど、さまざまなオプションが利用できます。

例えば、正の数に対しても符号を表示するためには、%+dを用います。

また、指定した幅で出力を整えたい場合は、数値の前に幅を記述します。

package main
import (
	"fmt"
)
func main() {
	number := 42
	// %+d は符号を表示、%5d は幅5で右寄せ表示、%-5d は左寄せ表示
	fmt.Printf("符号付き: %+d\n", number)
	fmt.Printf("右寄せ (幅5): %5d\n", number)
	fmt.Printf("左寄せ (幅5): %-5d\n", number)
}
符号付き: +42
右寄せ (幅5):    42
左寄せ (幅5): 42

浮動小数点型の書式指定子

浮動小数点数は、表示形式に応じて固定小数点表記や指数表記が選択できます。

幅や精度の調整により、出力結果の見た目を細かく制御できます。

固定小数点(%f)と指数表記(%e)の使い分け

浮動小数点数を出力する際、%fは固定小数点表記、%eは指数表記に適しています。

以下のサンプルでは、同じ数値を二通りの書式で表示しています。

package main
import (
	"fmt"
)
func main() {
	value := 1234.5678
	// %fは固定小数点表記、%eは指数表記
	fmt.Printf("固定小数点表記: %f\n", value)
	fmt.Printf("指数表記: %e\n", value)
}
固定小数点表記: 1234.567800
指数表記: 1.234568e+03

幅と精度の設定方法

幅と精度を指定することで、出力される数値の全体の桁数や小数点以下の桁数を調整できます。

たとえば、%10.2fは全体で10桁、うち小数点以下2桁で表示する意味になります。

また、数式で表すと、表示幅をw、精度をpとすると、指定は以下の形となります。

下記のサンプルコードでは、幅と精度を指定して数値を整形しています。

package main
import (
	"fmt"
)
func main() {
	value := 1234.5678
	// 幅10、小数点以下2桁でフォーマット
	fmt.Printf("幅10, 精度2: %10.2f\n", value)
	// 左寄せで幅10、小数点以下2桁
	fmt.Printf("左寄せ (幅10, 精度2): %-10.2f\n", value)
}
幅10, 精度2:    1234.57
左寄せ (幅10, 精度2): 1234.57

文字列およびその他の書式指定子

文字データやその他の型に対しては、適した書式指定子が用意されています。

ここでは文字列、文字、引用符付きの出力、詳細な出力、そしてブール型の出力方法について説明します。

文字列(%s)と文字(%c)の出力

文字列や単一の文字を出力する際には、%s%cを使用します。

サンプルコードでは、文字列と文字を個別に出力する例を示します。

package main
import (
	"fmt"
)
func main() {
	message := "こんにちは"
	character := 'あ'
	// %sは文字列、%cは文字として出力
	fmt.Printf("文字列: %s\n", message)
	fmt.Printf("文字: %c\n", character)
}
文字列: こんにちは
文字: あ

引用符付き出力(%q)と詳細表記(%v, %#v)

引用符付きの出力は、文字列の場合に%qを用いることで、出力結果が引用符で囲まれた形になります。

また、%vはデフォルトのフォーマットで出力する際に用い、%#vはGoの構文として有効な形で値を出力するため、デバッグ時に役立ちます。

package main
import (
	"fmt"
)
func main() {
	text := "Go言語"
	// %qは引用符付き、%vはデフォルト、%#vはGo形式の出力
	fmt.Printf("引用符付き出力: %q\n", text)
	fmt.Printf("詳細出力 (デフォルト): %v\n", text)
	fmt.Printf("詳細出力 (Go形式): %#v\n", text)
}
引用符付き出力: "Go言語"
詳細出力 (デフォルト): Go言語
詳細出力 (Go形式): "Go言語"

ブール型(%t)の書式

ブール値は、%t書式指定子を使用して出力します。

出力は、真の場合にtrue、偽の場合にfalseとなります。

package main
import (
	"fmt"
)
func main() {
	flag := true
	// %tを用いてブール型を出力
	fmt.Printf("状態: %t\n", flag)
}
状態: true

出力の配置と幅指定

出力内容の見た目を整えるためには、最小幅や精度の指定、左寄せ・右寄せの調整が大切です。

また、数値の前後に余白やパディングを追加することで、出力結果を読みやすくできます。

最小幅と精度の指定

数値だけでなく、文字列などにも最小幅と精度の指定が可能です。

指定した幅よりも短い場合は、空白で埋めることで全体の幅が統一されます。

サンプルコードで幅と精度の設定例を示します。

package main
import (
	"fmt"
)
func main() {
	value := 89
	// 幅5で右寄せ、精度の指定は整数には不要
	fmt.Printf("幅指定 (右寄せ): %5d\n", value)
	// 左寄せで幅5を指定
	fmt.Printf("幅指定 (左寄せ): %-5d\n", value)
}
幅指定 (右寄せ):    89
幅指定 (左寄せ): 89

左寄せと右寄せの指定

左寄せと右寄せの指定は、フォーマット指定子において、負の値や-を付けることで制御されます。

右寄せの場合はデフォルトの状態、左寄せの場合は%-○○のように記述します。

以下の例をご確認ください。

package main
import (
	"fmt"
)
func main() {
	text := "Go"
	// 右寄せと左寄せの例
	fmt.Printf("右寄せ (幅6): %6s\n", text)
	fmt.Printf("左寄せ (幅6): %-6s\n", text)
}
右寄せ (幅6):     Go
左寄せ (幅6): Go

整列とパディングの活用

出力内の複数の値を整列させる場合、固定幅の指定やパディング文字の利用が役立ちます。

特に見出しや表形式のデータを出力する際に、各項目の幅を統一することで、視認性が向上します。

パディングとして数値の場合は空白、あるいはゼロパディング%0○○dを使う方法もあります。

package main
import (
	"fmt"
)
func main() {
	// ゼロパディングの例:幅5に対して足りない桁を0で埋める
	number := 7
	fmt.Printf("ゼロパディング: %05d\n", number)
}
ゼロパディング: 00007

実践例と注意点

複数の書式指定子を組み合わせることで、出力内容を柔軟に制御できます。

ただし、指定子の並びに注意しないと、意図しない出力結果になる場合があります。

ここでは複数書式指定子の例と、よくある誤りの対処方法について紹介します。

複数書式指定子の組み合わせ例

異なる型の値を同時に出力する場合、各書式指定子は対応する値に順番に作用します。

組み合わせ例を以下のサンプルコードで示します。

package main
import (
	"fmt"
)
func main() {
	// さまざまな型の値をまとめて出力する例
	integerValue := 100
	floatValue := 3.14159
	stringValue := "サンプル"
	// 複数の指定子を適用して整形
	fmt.Printf("整数: %d, 浮動小数点: %8.3f, 文字列: %-10s\n", integerValue, floatValue, stringValue)
}
整数: 100, 浮動小数点:    3.142, 文字列: サンプル

よくある誤用と対処方法

書式指定子を用いる際の誤用としては、指定子の数と引数の数が一致しない場合や、型と指定子が合わない場合が挙げられます。

たとえば、整数型の値に対して%sを使用してしまうと、実行時エラーや予期せぬ出力が発生する可能性があります。

以下のサンプルコードは、正しく型に対応した指定子を使用する例です。

package main
import (
	"fmt"
)
func main() {
	// 使用する値と書式指定子が一致していることを確認
	intValue := 50
	boolValue := false
	// %dは整数、%tはブール型に対応
	fmt.Printf("整数値: %d, ブール値: %t\n", intValue, boolValue)
}
整数値: 50, ブール値: false

まとめ

この記事では、Printf関数の基本構文、整数・浮動小数点・文字列など各書式指定子の使い方や出力の配置・幅指定、実践例と注意点について詳しく解説しました。

全体を通して、サンプルコードを交えた具体的な説明で各指定子の動作と調整方法が理解できる内容になっています。

ぜひ、今回の知識を実際の開発現場で試し、コードの出力整形に役立ててみてください!

関連記事

Back to top button
目次へ