Goパッケージ一覧

【Go入門】fmtパッケージ ~ print系関数と書式指定

こんにちは。Go入門ブログの第20回です。

今回から、他の実践的なプログラミングと並行し、Goの代表的な標準パッケージについての解説を行いたいと思います。

過去の記事でも解説したように、Goの標準ライブラリは、すべて固有の名前を持つパッケージとして提供されています。
Goの標準パッケージは非常に充実しており、特に外部のパッケージを利用しなくても充分に開発を行うことができます。

今回は、これまでの記事でも頻繁に使用してきたfmtパッケージについて、あらためて解説を行っていきます。

fmtパッケージの機能

fmtパッケージは、主に文字列の入出力と、フォーマット(書式設定)に関する機能を提供するパッケージです。
C言語におけるprintfやscanfに該当する関数が含まれています。

fmtパッケージの関数群

Print/Println/Printf

PrintPrintfPrintln関数は、標準出力への出力関数です。

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!")

}

このサンプルの実行結果は以下のようになります。

$ go run main.go
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)

}

このサンプルも、同様の実行結果が得られます。

$ go run main.go
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コードポイントに対応する文字
}
$ go run main.go
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
}
$ go run main.go
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は大文字)
}

$ go run main.go
文字列
文字列
“文字列”
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))        // ポインタ
}
$ go run main.go
true
123
123
12.34
(1-2i)
文字列
0xc00003e060
0xc000010118

終わりに

今回は、Goの代表的な標準パッケージのひとつであるfmtパッケージをピックアップしました。
他にも便利なパッケージがたくさんありますので、特に重要なものについては、今後の記事でも解説していきたいと思います。


スポンサーリンク
スポンサーリンク
スポンサーリンク