こんにちは。Go入門ブログの第20回です。
今回から、他の実践的なプログラミングと並行し、Goの代表的な標準パッケージについての解説を行いたいと思います。
過去の記事でも解説したように、Goの標準ライブラリは、すべて固有の名前を持つパッケージとして提供されています。
Goの標準パッケージは非常に充実しており、特に外部のパッケージを利用しなくても充分に開発を行うことができます。
今回は、これまでの記事でも頻繁に使用してきたfmtパッケージについて、あらためて解説を行っていきます。
fmtパッケージの機能
fmtパッケージは、主に文字列の入出力と、フォーマット(書式設定)に関する機能を提供するパッケージです。
C言語におけるprintfやscanfに該当する関数が含まれています。
fmtパッケージの関数群
Print/Println/Printf
Print、Printf、Println関数は、標準出力への出力関数です。
Print関数は、オペランドをデフォルトのフォーマットで標準出力への書きこみを行います。
Println関数も同様に、デフォルトフォーマットで標準出力に書きこみますが、この際オペランドの間に半角スペースが入り、文字列の最後に改行が追加されます。
Printf関数は、指定されたフォーマットに従ってフォーマットを行い、標準出力に書きこみます。
package main import "fmt" func main() { // Print関数: デフォルトフォーマットで出力する fmt.Print("Hello,", "World!") // Println関数: オペランドの半角スペースと末尾の改行を追加する fmt.Println("Hello,", "world!") // Printf関数: 指定されたフォーマットに従って出力する fmt.Printf("%s\n", "Hello, World!") }
このサンプルの実行結果は以下のようになります。
Hello,World!Hello, world!
Hello, World!
Print関数は末尾に改行を追加しないため、次のPrintln関数の出力も同じ行に行われていることに注目してください。
Fprint/Fprintln/Fprintf
Fprint関数は、任意のio.Writer型への出力関数です。
標準出力以外にも、書き込み先を明示的に指定することができます。
Println、Printfも同様にプレフィックスFを付与することができます。
package main import ( "fmt" "log" "os" ) func main() { // hello.txtファイルを作成 f, err := os.Create("hello.txt") if err != nil { log.Fatal(err) } defer f.Close() // Fprint関数でhello.txtファイルへ出力 fmt.Fprint(f, "Hello,", "World!") fmt.Fprintln(f, "Hello,", "world!") fmt.Fprintf(f, "%s\n", "Hello, World!") }
このサンプルを実行すると、プログラムファイルと同じパスに”hello.txt”が作成され、先ほどのサンプルと同じ内容がファイルに書き込みされます。
Sprint/Sprintln/Sprintf
Sprint関数は、文字列への出力関数です。
標準出力や出力を行うのではなく、フォーマットした結果をプログラム内で文字列で返します。
Println、Printfも同様にプレフィックスSを付与することができます。
変数に代入する際などはこちらを使用すると良いでしょう。
package main import "fmt" func main() { // Sprint関数で変数にフォーマットした文字列を代入する sp := fmt.Sprint("Hello,", "World!") spln := fmt.Sprintln("Hello,", "world!") spf := fmt.Sprintf("%s\n", "Hello, World!") // Print関数で変数の値を出力 fmt.Print(sp, spln, spf) }
このサンプルも、同様の実行結果が得られます。
Hello,World!Hello, world!
Hello, World!
fmtパッケージの書式指定子
前述の通り、Printf・Sprintf・Frintf関数では、出力時のフォーマットを指定することができます。
Printf系関数で使用可能なフォーマットの書式指定子について、対象の型別にまとめます。
出力サンプルもあわせて記載しますので、必要に応じて参照してください
整数型
指定子 | 用法・用途 |
---|---|
%d | 10進数で出力する |
%+d | 10進数で出力し、正の整数でも符号を付与する |
%(数値)d | 10進数で出力し、(数値)で指定した桁数だけ左を半角スペースで埋める |
%-(数値)d | 10進数で出力し、(数値)で指定した桁数だけ右を半角スペースで埋める |
%0(数値)d | 10進数で出力し、(数値)で指定した桁数だけ左を0で埋める |
%b | 2進数で出力する |
%o | 8進数で出力する |
%#o | 0付き8進数で出力する |
%x | 16進数で出力する(a-fは小文字) |
%#x | 0x付き16進数で出力する(a-fは小文字) |
%X | 16進数で出力する(A-Fは大文字) |
%#X | 0x付き16進数で出力する(A-Fは大文字) |
%U | Unicodeコードポイントに対応する文字で出力する |
package main import "fmt" func main() { // val := 123 fmt.Printf("%d\n", val) // 10進数 fmt.Printf("%+d\n", val) // 10進数・正の整数でも符号を付与 fmt.Printf("%6d\n", val) // 10進数・指定した桁数だけ左スペース埋め fmt.Printf("%-6d\n", val) // 10進数・指定した桁数だけ右スペース埋め fmt.Printf("%06d\n", val) // 10進数・指定した桁数だけ左0埋め fmt.Printf("%b\n", val) // 2進数 fmt.Printf("%o\n", val) // 8進数 fmt.Printf("%#o\n", val) // 0つき8進数 fmt.Printf("%x\n", val) // 16進数(a-fは小文字) fmt.Printf("%#x\n", val) // 0xつき16進数(a-fは小文字) fmt.Printf("%X\n", val) // 16進数(A-Fは大文字) fmt.Printf("%#X\n", val) // 0Xつき16進数(A-Fは大文字) fmt.Printf("%U\n", val) // Unicodeコードポイントに対応する文字 }
123
+123
123
123
000123
1111011
173
0173
7b
0x7b
7B
0X7B
U+007B
浮動小数点型と複素数型
指定子 | 用法・用途 |
---|---|
%f | 実数表現で出力する |
%F | 実数表現で出力する(%fと同じ) |
%e | 仮数と指数表現で出力する(eは小文字) |
%E | 仮数と指数表現で出力する(Eは大文字) |
%g | 指数部が大きい場合は%e、それ以外は%fで出力する |
%G | 指数部が大きい場合は%E、それ以外は%Fで出力する |
package main import ( "fmt" ) func main() { val := 1234.56789 fmt.Printf("%f\n", val) // 実数表現 fmt.Printf("%F\n", val) // 実数表現(%fと同じ) fmt.Printf("%e\n", val) // 仮数と指数表現(eが小文字) fmt.Printf("%E\n", val) // 仮数と指数表現(Eが大文字) fmt.Printf("%g\n", val) // 指数部が大きい場合は%e、それ以外は%f fmt.Printf("%G\n", val) // 指数部が大きい場合は%E、それ以外は%F }
1234.567890
1234.567890
1.234568e+03
1.234568E+03
1234.56789
1234.56789
文字列型
指定子 | 用法・用途 |
---|---|
%s | そのままの書式で出力する |
%(数値)s | (数値)で指定した桁数だけ左を半角スペースで埋める |
%e | Goの文法上のエスケープをした文字列で出力する(ダブルクォート付与) |
%q | |
%x | 16進数表現で出力する(a-fは小文字) |
%X | 16進数表現で出力する(A-Fは大文字) |
package main import ( "fmt" ) func main() { val := "文字列" fmt.Printf("%s\n", val) // そのままの書式で出力 fmt.Printf("%10s\n", val) // 指定された桁数で左スペース埋め fmt.Printf("%q\n", val) // Goの文法上のエスケープをした文字列(ダブルクォート付与) fmt.Printf("%x\n", val) // 16進数表現(a-fは小文字) fmt.Printf("%X\n", val) // 16進数表現(A-Fは大文字) }
文字列
文字列
“文字列”
e69687e5ad97e58897
E69687E5AD97E58897
汎用
%vは、様々な型の値を柔軟に出力することができます。
%vが指定されると、対象の値の型に応じて、デフォルトのフォーマットでの表現が出力されます。
package main import ( "fmt" ) func main() { fmt.Printf("%v\n", true) // 論理値 fmt.Printf("%v\n", 123) // 符号付き整数 fmt.Printf("%v\n", uint(123)) // 符号なし整数 fmt.Printf("%v\n", 12.34) // 浮動小数点数 fmt.Printf("%v\n", 1-2i) // 複素数 fmt.Printf("%v\n", "文字列") // 文字列 fmt.Printf("%v\n", make(chan bool)) // チャネル fmt.Printf("%v\n", new(int)) // ポインタ }
true
123
123
12.34
(1-2i)
文字列
0xc00003e060
0xc000010118
終わりに
今回は、Goの代表的な標準パッケージのひとつであるfmtパッケージをピックアップしました。
他にも便利なパッケージがたくさんありますので、特に重要なものについては、今後の記事でも解説していきたいと思います。