カテゴリー: BackEnd

Goのfmt.print系関数のまとめ

はじめに

今回は、Goで最も使われているfmtパッケージの各print関数についてまとめます。

print関数の命名規則

fmtパッケージの各print関数には、大きく3つの種類があります。

  1. PrintPrintPrintfPrintln)系(標準出力へ出力する)
  2. SprintSprintSprintfSprintln)系(文字列を出力する)
  3. FprintFprintFprintfFprintln)系(ファイルへ出力する)

上記を見て分かる通り、各print関数には2つの規則があります。

1つ目の規則は、関数の先頭の文字が出力先を表しているということです。頭が「S」から始まるものは文字列を返し、「F」から始まるのはファイルへ出力し、頭に何もつかないものは標準出力へ出力します。

2つ目の規則は、関数の末尾の文字が出力方法を表しているということです。末尾が「f」で終わるものはフォーマットを指定することができ、末尾が「ln」で終わるものは出力した文字が末尾で改行され、末尾に何もつかないものは改行なしで出力されます。

各print関数の説明

各print関数の違いがわかったところで、次にそれぞれの関数について詳しくみていきます。

Print(標準出力へ出力)系関数

関数の頭に何もつかないPrint系関数は標準出力に出力します。

func Print(a ...any) (n int, err error)

任意の数のany型(interface{}型)の引数を受け取り、改行なしで出力します。

package main

import "fmt"

func main() {
 num := 1
 str := "abcdefg"
 vector := struct{ X, Y int }{1, 2}
 fmt.Print(num)
 fmt.Print(str)
 fmt.Print(vector)
 fmt.Print(num, str, vector)
}

出力結果は以下の通り。

1abcdefg{1 2}1abcdefg{1 2}

このように、改行されずにすべて1行で出力されます。また、カンマ区切りで複数の値を渡した場合でも、とくにスペースなどで区切られずそのまま出力されます。

func Printf(format string, a ...any) (n int, err error)

第1引数でフォーマットを指定し、第2引数以降で渡したデータをフォーマットに沿って埋め込んで出力します。

package main

import "fmt"

func main() {
 num := 1
 str := "abcdefg"
 vector := struct{ X, Y int }{1, 2}
 fmt.Printf("[%d] [%s] [%v]", num, str, vector)
}

出力結果は以下の通りです。

[1] [abcdefg] [{1 2}]

フォーマットの書式指定子(「%s」など)については、後ほど紹介します。

func Println(a ...any) (n int, err error)

任意の数のany型(interface{}型)の引数を受け取り、末尾改行込で出力します。

package main

import "fmt"

func main() {
 num := 1
 str := "abcdefg"
 vector := struct{ X, Y int }{1, 2}
 fmt.Println(str)
 fmt.Println(vector)
 fmt.Println(num, str, vector)
}

出力結果は以下の通りです。

abcdefg
{1 2}
1 abcdefg {1 2}

出力が改行される以外はPrint関数と同じです。

Sprint(文字列を出力)系関数

関数の頭が「S」から始まるSprint系関数は、文字列として出力します。

func Sprint(a ...any) string

任意の数のany型(interface{}型)の引数を受け取り、文字列型を返します。

package main

import "fmt"

func main() {
 num := 1
 str := "abcdefg"
 vector := struct{ X, Y int }{1, 2}
 s1 := fmt.Sprint(str)
 s2 := fmt.Sprint(vector)
 s3 := fmt.Sprint(num, str, vector)
 fmt.Println(s1)
 fmt.Println(s2)
 fmt.Println(s3)
}

出力結果は以下の通り。

abcdefg
{1 2}
1abcdefg{1 2}

func Sprintf(format string, a ...any) string

第1引数でフォーマットを指定し、第2引数以降で渡したデータをフォーマットに沿って埋め込んで文字列型を返します。

package main

import "fmt"

func main() {
 num := 1
 str := "abcdefg"
 vector := struct{ X, Y int }{1, 2}
 s := fmt.Sprintf("[%d] [%s] [%v]", num, str, vector)
 fmt.Println(s)
}

出力結果は以下の通りです。

[1] [abcdefg] [{1 2}]

func Sprintln(a ...any) string

任意の数のany型(interface{}型)の引数を受け取り、末尾改行込で文字列型を返します。

package main

import "fmt"

func main() {
 num := 1
 str := "abcdefg"
 vector := struct{ X, Y int }{1, 2}
 s1 := fmt.Sprintln(num)
 s2 := fmt.Sprintln(str)
 s3 := fmt.Sprintln(vector)
 fmt.Print(s1)
 fmt.Print(s2)
 fmt.Print(s3)
}

出力結果は以下の通りです。

abcdefg
{1 2}
1 abcdefg {1 2}

Fprint(ファイルへ出力)系関数

関数の頭が「F」から始まるFprint系関数は、ファイルへ出力します。3つの関数はいずれも第1引数にファイル(io.Writer型)を受け取ります。

func Fprint(w io.Writer, a ...any) string

任意の数のany型(interface{}型)の引数を受け取り、ファイルへ出力します。

package main

import (
 "fmt"
 "os"
)

func main() {
 num := 1
 str := "abcdefg"
 vector := struct{ X, Y int }{1, 2}
 fmt.Fprint(os.Stdout, num)
 fmt.Fprint(os.Stdout, str)
 fmt.Fprint(os.Stdout, vector)
}

ここでは、ファイルの代わりに標準出力(os.Stdout)に出力しています。出力結果は以下の通り。

1abcdefg{1 2}

func Fprintf(w io.Writer, format string, a ...any) string

第2引数でフォーマットを指定し、第3引数以降で渡したデータをフォーマットに沿って埋め込んで文字列型を返します。

package main

import (
 "fmt"
 "os"
)

func main() {
 num := 1
 str := "abcdefg"
 vector := struct{ X, Y int }{1, 2}
 fmt.Fprintf(os.Stdout, "[%d] [%s] [%v]", num, str, vector)
}

ここでは、ファイルの代わりに標準出力(os.Stdout)に出力しています。出力結果は以下の通りです。

[1] [abcdefg] [{1 2}]

func Fprintln(w io.Writer, a ...any) string

任意の数のany型(interface{}型)の引数を受け取り、末尾改行込で文字列型を返します。

package main

import (
 "fmt"
 "os"
)

func main() {
 num := 1
 str := "abcdefg"
 vector := struct{ X, Y int }{1, 2}
 fmt.Fprintln(os.Stdout, num)
 fmt.Fprintln(os.Stdout, str)
 fmt.Fprintln(os.Stdout, vector)
}

ここでは、ファイルの代わりに標準出力(os.Stdout)に出力しています。出力結果は以下の通りです。

abcdefg
{1 2}
1 abcdefg {1 2}

書式指定子の一覧

最後に、Printfのところで触れた書式指定子について紹介します。

書式指定子はフォーマットに埋め込む際の書式を決めるものです。例えば、%sは文字列の埋め込みに使われ、%dは数値を埋め込むに使われます。

よく使われそうな書式指定子をいくつか紹介します。

文字列型

書式指定子 書式
%s 文字列
%10s 文字数が指定した文字数になるように半角スペースで右詰め
%-10s 文字数が指定した文字数になるように半角スペースで左詰め
%q ダブルクオートで囲って表示

整数型

書式指定子 書式
%d 整数
%+d 符号付き整数
%10d 指定した桁数で右詰め(半角スペース)
%-10d 指定した桁数で左詰め(半角スペース)
%010d 指定した桁数で右詰め(0で埋める)
%c Unicode文字で表示
%o 8進数で表示
%x 16進数で表示

浮動小数点型

書式指定子 書式
%f 実数
%.3f 小数点以下を指定した桁で丸める

その他

書式指定子 書式
%t bool型
%p ポインタのアドレス
%T 型を表示
%v any型
%+v 構造体を出力する際にフィールド名を加える
%#v Go言語のリテラル表現で情報を埋め込む

さいごに

Goで最もよく使われているfmtパッケージの各Print系関数について紹介しました。

おすすめ書籍

Hiroki Ono

シェア
執筆者:
Hiroki Ono
タグ: golang

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

3週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

1か月 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前