入出力

Go言語のフォーマット指定子について解説

Go言語のfmtパッケージで使用するフォーマット指定子について解説します。

出力形式の制御に役立つ指定子を具体例を交えながら紹介し、実装の現場での活用を促します。

この記事を通して、簡単に使える指定子の使い方を確認してみてください。

基本のフォーマット指定子

Go言語では、文字列への変換や出力のために多彩なフォーマット指定子を利用することができます。

ここでは代表的な指定子について優しく説明します。

数値型の指定子

数値を指定する場合、主に整数型と浮動小数点型の指定子があります。

整数型指定子(%d, %o, %x, %X)

%dは10進数表記を利用します。

%oは8進数表記を利用します。

%xおよび%Xは16進数表記で、小文字または大文字のアルファベットを表示します。

例えば、以下のコードは整数を異なる進数で出力するサンプルになります。

package main
import "fmt"
func main() {
	integerValue := 255 // 整数の値
	// 10進数、8進数、16進数の出力例
	fmt.Printf("10進数: %d\n", integerValue)   // 10進数で出力
	fmt.Printf("8進数: %o\n", integerValue)    // 8進数で出力
	fmt.Printf("16進数(小文字): %x\n", integerValue) // 16進数で出力(小文字)
	fmt.Printf("16進数(大文字): %X\n", integerValue) // 16進数で出力(大文字)
}
10進数: 255
8進数: 377
16進数(小文字): ff
16進数(大文字): FF

浮動小数点型指定子(%f, %e, %g)

%fは浮動小数点数を小数点以下固定の形式で表示します。

%eは指数表記(例:1.23e+03)の形式で出力します。

%gは値に応じて%fまたは%eのいずれか短い形式で出力します。

以下のコードで浮動小数点数の出力方法を確認できます。

package main
import "fmt"
func main() {
	floatValue := 123.456 // 浮動小数点数の値
	// 浮動小数点数の出力例
	fmt.Printf("固定小数点表記: %f\n", floatValue)   // %fで出力
	fmt.Printf("指数表記: %e\n", floatValue)           // %eで出力
	fmt.Printf("汎用フォーマット: %g\n", floatValue)      // %gで出力
}
固定小数点表記: 123.456000
指数表記: 1.234560e+02
汎用フォーマット: 123.456

文字列およびブール型の指定子

数値以外にも文字列やブール値の出力に対応する指定子が用意されています。

文字列指定子(%s, %q)

%sはそのまま文字列を出力します。

%qは文字列を引用符付きで出力します。

以下に文字列出力の例を示します。

package main
import "fmt"
func main() {
	text := "こんにちは、世界!" // サンプルの文字列
	// 文字列の出力例
	fmt.Printf("通常の出力: %s\n", text)  // %sで出力
	fmt.Printf("引用符付き出力: %q\n", text) // %qで出力
}
通常の出力: こんにちは、世界!
引用符付き出力: "こんにちは、世界!"

ブール型指定子(%t)

%tはブール型の値をtrueまたはfalseで表示します。

下記のコードでは、ブール値の出力例をご紹介します。

package main
import "fmt"
func main() {
	flag := true // ブール値
	// ブール値の出力例
	fmt.Printf("ブール値: %t\n", flag)
}
ブール値: true

その他の指定子

出力内容を簡単に表示したい場合や変数の内容全体を確認したい場合に便利な指定子があります。

複合型指定子(%v, %+v, %#v)

%vは変数の値をデフォルトの形式で表示します。

%+vは構造体などの場合、フィールド名も合わせて表示します。

%#vはより詳しい情報、すなわちGo言語の構文に沿った形で値を表示します。

以下のサンプルは構造体の出力例です。

package main
import "fmt"
// Sampleはサンプルの構造体です
type Sample struct {
	Name string
	Age  int
}
func main() {
	instance := Sample{Name: "太郎", Age: 30}
	// 様々なフォーマット指定子で出力
	fmt.Printf("デフォルト形式: %v\n", instance)
	fmt.Printf("フィールド名付き: %+v\n", instance)
	fmt.Printf("Go構文形式: %#v\n", instance)
}
デフォルト形式: {太郎 30}
フィールド名付き: {Name:太郎 Age:30}
Go構文形式: main.Sample{Name:"太郎", Age:30}

ポインタ指定子(%p)

%pは変数のポインタ、すなわちメモリアドレスを出力します。

下記のコードでは、ポインタの出力例が表示されます。

package main
import "fmt"
func main() {
	number := 100
	ptr := &number // ポインタの取得
	// ポインタの出力
	fmt.Printf("ポインタ: %p\n", ptr)
}
ポインタ: 0xc000014098

フォーマットのカスタマイズオプション

フォーマット指定子は、単に値を出力するだけでなく、出力の幅や精度などのカスタマイズも可能です。

ここでは、幅と精度の指定方法やフラグについて説明します。

幅と精度の指定

出力のレイアウトを整えたい場合、幅と精度を指定することができます。

数値の幅と精度指定

数値の場合、指定子に幅や精度を設定することで、出力全体の文字数や小数点以下の桁数を制御できます。

たとえば、幅を10桁、小数点以下を2桁に指定する場合は、%10.2fのように記述します。

以下にサンプルコードを示します。

package main
import "fmt"
func main() {
	num := 123.456789
	// 10桁の幅と小数点以下2桁の指定
	fmt.Printf("整形された数値: %10.2f\n", num)
}
整形された数値:     123.46

文字列の幅と精度指定

文字列の場合、幅を指定すると出力時に指定幅分のスペースが確保されます。

また、精度を利用することで表示する文字数を制限することも可能です。

たとえば、%10.5sは、全体幅を10、最大表示文字数を5に設定します。

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

package main
import "fmt"
func main() {
	str := "こんにちは世界"
	// 10幅、最大5文字を表示
	fmt.Printf("整形された文字列: %10.5s\n", str)
}
整形された文字列:      こんにちは

フラグおよびオプション指定

フォーマット指定子には、出力形式をさらに細かく制御するためのフラグやオプションが用意されています。

左寄せ指定(-)

出力を左寄せにするためには、指定子にハイフン-を付けます。

これにより、右側に空白が埋め込まれて整形されます。

以下の例では、左寄せの動作を確認できます。

package main
import "fmt"
func main() {
	value := 42
	// 左寄せで出力
	fmt.Printf("左寄せ: %-5dend\n", value)
}
左寄せ: 42   end

ゼロ埋め指定(0)

出力の桁数が不足する場合、先頭をゼロで埋めるためには0フラグを利用します。

例えば、%05dは桁数が5になるように先頭に0を追加します。

以下にサンプルコードを示します。

package main
import "fmt"
func main() {
	value := 42
	// ゼロ埋めして出力
	fmt.Printf("ゼロ埋め: %05d\n", value)
}
ゼロ埋め: 00042

実用例と応用パターン

ここでは、実際の開発現場でも便利に使えるフォーマット指定子の利用パターンについて、いくつか具体例と共に解説します。

各例とも、main関数内で動作するコードを提供していますので、すぐに試すことができます。

fmt.Printfを利用した出力例

fmt.Printfは画面への出力に便利な関数です。

数値や文字列、ブール値などを組み合わせた出力例を次のコードに示します。

package main
import "fmt"
func main() {
	// 各種変数の宣言
	integer := 100
	floatNum := 3.14159
	text := "サンプル文字列"
	boolean := false
	// 複数の指定子を利用した出力例
	fmt.Printf("整数: %d, 8進数: %o, 16進数: %x\n", integer, integer, integer)
	fmt.Printf("浮動小数点数: %f, 指数表記: %e\n", floatNum, floatNum)
	fmt.Printf("文字列: %s, 引用符付き文字列: %q\n", text, text)
	fmt.Printf("ブール値: %t\n", boolean)
}
整数: 100, 8進数: 144, 16進数: 64
浮動小数点数: 3.141590, 指数表記: 3.141590e+00
文字列: サンプル文字列, 引用符付き文字列: "サンプル文字列"
ブール値: false

fmt.Sprintfを利用した文字列作成例

fmt.Sprintfは、フォーマットされた結果を文字列として返す関数です。

ログの記録や文字列の加工に非常に役立ちます。

以下は、数値と文字列を結合して整形された文字列を作成する例です。

package main
import "fmt"
func main() {
	score := 90
	name := "花子"
	// 指定子を利用して文字列を作成
	result := fmt.Sprintf("受験者: %s さんは%03d点を取得しました。", name, score)
	fmt.Println(result)
}
受験者: 花子 さんは090点を取得しました。

ログ出力でのフォーマット指定子利用例

アプリケーションのログ出力においても、フォーマット指定子は効果的に活用できます。

以下のコードは、構造体の内容やタイムスタンプを含むログを出力する例です。

package main
import (
	"fmt"
	"time"
)
// LogEntryはログ出力用のサンプル構造体です
type LogEntry struct {
	Level   string
	Message string
	Time    time.Time
}
func main() {
	entry := LogEntry{
		Level:   "INFO",
		Message: "サービスが起動しました",
		Time:    time.Now(),
	}
	// ログ出力の例。複合型指定子を活用して構造体の情報も表示
	log := fmt.Sprintf("[%s] %s - %v", entry.Time.Format("2006-01-02 15:04:05"), entry.Level, entry.Message)
	fmt.Println(log)
}
[2023-10-01 12:34:56] INFO - サービスが起動しました

まとめ

この記事ではGo言語のフォーマット指定子やカスタマイズオプション、実用例と応用パターンについて詳しく解説しました。

各指定子の役割や出力形式の設定方法を、具体的なサンプルコードを通して理解できる内容です。

ぜひ実際にコードを書いて、習得した知識を活用しながらさらにスキルを高めてください。

関連記事

Back to top button
目次へ