go-printf - 課題
プロジェクト概要
go-printf は、C言語の printf 関数を Go で再実装する課題です。フォーマット指定子の解析と、様々な型の値を文字列に変換する処理を実装します。
提出ファイル
go-printf/
├── go.mod
├── printf.go # メイン実装
├── printf_test.go # テスト
└── printf_bonus.go # ボーナス(オプション)
マンダトリー要件
実装する関数
// Printf はフォーマットに従って標準出力に出力し、書き込んだバイト数を返す
func Printf(format string, args ...interface{}) int
// Sprintf はフォーマットに従って文字列を生成して返す
func Sprintf(format string, args ...interface{}) string
サポートするフォーマット指定子
| 指定子 |
説明 |
例 |
| `%c` |
文字(rune) |
`'A'` → `A` |
| `%s` |
文字列 |
`"hello"` → `hello` |
| `%d` |
10進整数 |
`42` → `42` |
| `%i` |
10進整数(%d と同じ) |
`42` → `42` |
| `%u` |
符号なし10進整数 |
`42` → `42` |
| `%x` |
16進数(小文字) |
`255` → `ff` |
| `%X` |
16進数(大文字) |
`255` → `FF` |
| `%o` |
8進数 |
`8` → `10` |
| `%b` |
2進数 |
`5` → `101` |
| `%p` |
ポインタ |
`0x1234abcd` |
| `%%` |
パーセント記号 |
`%` |
フラグ
| フラグ |
説明 |
| `-` |
左寄せ |
| `0` |
ゼロ埋め |
| `+` |
正の数にも符号を表示 |
| ` ` |
正の数の前にスペース |
| `#` |
代替形式(0x, 0o など) |
幅と精度
Printf("%10d", 42) // " 42" (幅10)
Printf("%-10d", 42) // "42 " (左寄せ)
Printf("%010d", 42) // "0000000042" (ゼロ埋め)
Printf("%.5d", 42) // "00042" (精度5)
Printf("%10.5d", 42) // " 00042" (幅10, 精度5)
Printf("%*d", 10, 42) // " 42" (幅を引数で指定)
Printf("%.*d", 5, 42) // "00042" (精度を引数で指定)
ボーナス要件
浮動小数点サポート
Printf("%f", 3.14159) // "3.141590"
Printf("%.2f", 3.14159) // "3.14"
Printf("%e", 1234.5) // "1.234500e+03"
Printf("%E", 1234.5) // "1.234500E+03"
Printf("%g", 0.0001234) // "0.0001234" または "1.234e-04"
カラー出力
Printf("{red}Error:{reset} %s\n", msg)
Printf("{green}Success!{reset}\n")
禁止事項
fmt パッケージの使用禁止
strconv.FormatInt, strconv.FormatFloat の使用禁止
- 外部ライブラリの使用禁止
実装上の注意
- 引数の型チェック:
interface{} からの型アサーションを正しく行う
- エッジケース: 負数、ゼロ、最大値のテスト
- メモリ効率: 不要な文字列連結を避ける
- エラー処理: 不正なフォーマット指定子は
%!指定子(型=値) 形式で出力