【Go】fmt.Printfのフォーマット指定子まとめ＆チートシート

## はじめに

Go言語でフォーマット付き出力を行う際に欠かせないのが`fmt.Printf`です。
しかし、使えるフォーマット指定子（バーブ）の種類が多く、どれを使えばいいのか迷うこともありますよね？

本記事では、`fmt.Printf`で使えるすべてのフォーマット指定子を**説明＋サンプルコード付き**で分かりやすく解説します！
さらに、すぐに使える**チートシート**も用意しているので、ぜひ参考にしてください 💡

---

## 各バーブの説明とサンプルコード

### 一般的なバーブ
| バーブ | 説明 |
|--------|------|
| `%v`   | デフォルトのフォーマットで値を表示 |
| `%+v`  | 構造体のフィールド名を含めて表示 |
| `%#v`  | Go の構文として有効な形で表示 |
| `%T`   | 値の型を表示 |
| `%%`   | リテラルの `%` を表示 |

```go
package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{Name: "Alice", Age: 30}

    fmt.Printf("%v\n", p)   // {Alice 30}
    fmt.Printf("%+v\n", p)  // {Name:Alice Age:30}
    fmt.Printf("%#v\n", p)  // main.Person{Name:"Alice", Age:30}
    fmt.Printf("%T\n", p)   // main.Person
    fmt.Printf("%%\n")      // %
}
```

---

### ブーリアン
| バーブ | 説明 |
|--------|------|
| `%t`   | `true` または `false` を表示 |

```go
package main

import "fmt"

func main() {
    flag := true
    fmt.Printf("%t\n", flag)  // true
}
```

---

### 整数
| バーブ | 説明 |
|--------|------|
| `%b`   | 2進数 |
| `%c`   | Unicodeコードポイントを文字で表示 |
| `%d`   | 10進数 |
| `%o`   | 8進数 |
| `%O`   | `0o` プレフィックス付きの8進数 |
| `%q`   | 文字をシングルクォート付きで表示 |
| `%x`   | 16進数（小文字） |
| `%X`   | 16進数（大文字） |
| `%U`   | Unicode 形式（U+XXXX） |

```go
package main

import "fmt"

func main() {
    num := 65

    fmt.Printf("%b\n", num)  // 1000001
    fmt.Printf("%c\n", num)  // A
    fmt.Printf("%d\n", num)  // 65
    fmt.Printf("%o\n", num)  // 101
    fmt.Printf("%O\n", num)  // 0o101
    fmt.Printf("%q\n", num)  // 'A'
    fmt.Printf("%x\n", num)  // 41
    fmt.Printf("%X\n", num)  // 41
    fmt.Printf("%U\n", num)  // U+0041
}
```

---

### 浮動小数点数と複素数
| バーブ | 説明 |
|--------|------|
| `%b`   | 2の指数形式 |
| `%e`   | 科学技術表記（小文字） |
| `%E`   | 科学技術表記（大文字） |
| `%f`   | 小数点形式 |
| `%F`   | `%f` のエイリアス |
| `%g`   | `%e` または `%f` を適用 |
| `%G`   | `%E` または `%F` を適用 |
| `%x`   | 16進浮動小数点 |
| `%X`   | 16進浮動小数点（大文字） |

```go
package main

import "fmt"

func main() {
    f := 123.456

    fmt.Printf("%b\n", f)  // 64-bit 表現
    fmt.Printf("%e\n", f)  // 1.234560e+02
    fmt.Printf("%E\n", f)  // 1.234560E+02
    fmt.Printf("%f\n", f)  // 123.456000
    fmt.Printf("%F\n", f)  // 123.456000
    fmt.Printf("%g\n", f)  // 123.456
    fmt.Printf("%G\n", f)  // 123.456
}
```

---

### 文字列とバイトスライス
| バーブ | 説明 |
|--------|------|
| `%s`   | 文字列として表示 |
| `%q`   | Go のクォート付きの形で表示 |
| `%x`   | 16進数（小文字） |
| `%X`   | 16進数（大文字） |

```go
package main

import "fmt"

func main() {
    str := "Hello"

    fmt.Printf("%s\n", str)  // Hello
    fmt.Printf("%q\n", str)  // "Hello"
    fmt.Printf("%x\n", str)  // 48656c6c6f
    fmt.Printf("%X\n", str)  // 48656C6C6F
}
```

---

### スライスとポインタ
| バーブ | 説明 |
|--------|------|
| `%p`   | ポインタのアドレス |

```go
package main

import "fmt"

func main() {
    arr := []int{1, 2, 3}
    fmt.Printf("%p\n", &arr)  // 0xc0000140f0 (メモリアドレス)
}
```

---

## フォーマット指定子のチートシート
| カテゴリ | バーブ | 説明 |
|----------|--------|------|
| 一般    | `%v` | デフォルトの表示形式 |
|         | `%+v` | フィールド名付き |
|         | `%#v` | Go の構文で表示 |
|         | `%T` | 型を表示 |
|         | `%%` | `%` を表示 |
| ブール  | `%t` | `true` または `false` |
| 整数    | `%b` | 2進数 |
|         | `%c` | Unicode文字 |
|         | `%d` | 10進数 |
|         | `%o` | 8進数 |
|         | `%O` | `0o` 付き8進数 |
|         | `%q` | シングルクォート付き |
|         | `%x` | 16進数（小文字） |
|         | `%X` | 16進数（大文字） |
|         | `%U` | Unicode 形式 |
| 浮動小数点数 | `%b` | 2の指数形式 |
|         | `%e` | 科学技術表記（小文字） |
|         | `%E` | 科学技術表記（大文字） |
|         | `%f` | 小数点表示 |
|         | `%g` | `%e` または `%f` |
|         | `%G` | `%E` または `%F` |
| 文字列  | `%s` | 文字列として表示 |
|         | `%q` | クォート付き表示 |
|         | `%x` | 16進数（小文字） |
|         | `%X` | 16進数（大文字） |
| ポインタ | `%p` | メモリアドレス |

## まとめ

`fmt.Printf`には、多くのフォーマット指定子があり、用途に応じて適切に使い分けることが重要です。
本記事で紹介した**チートシート**を活用すれば、必要なバーブを素早く見つけることができます ✅

Goのフォーマット指定をしっかり理解し、効率的にコードを書いていきましょう！ 🚀

## 公式ドキュメント

https://pkg.go.dev/fmt