はじめに
今回は、Goで最も使われている
fmt
パッケージの各print関数についてまとめます。
print関数の命名規則
fmt
パッケージの各print関数には、大きく3つの種類があります。
-
Print
(Print
、Printf
、Println
)系(標準出力へ出力する) -
Sprint
(Sprint
、Sprintf
、Sprintln
)系(文字列を出力する) -
Fprint
(Fprint
、Fprintf
、Fprintln
)系(ファイルへ出力する)
上記を見て分かる通り、各print関数には2つの規則があります。
1つ目の規則は、関数の先頭の文字が出力先を表しているということです。頭が「S」から始まるものは文字列を返し、「F」から始まるのはファイルへ出力し、頭に何もつかないものは標準出力へ出力します。
2つ目の規則は、関数の末尾の文字が出力方法を表しているということです。末尾が「f」で終わるものはフォーマットを指定することができ、末尾が「ln」で終わるものは出力した文字が末尾で改行され、末尾に何もつかないものは改行なしで出力されます。
各print関数の説明
各print関数の違いがわかったところで、次にそれぞれの関数について詳しくみていきます。
Print(標準出力へ出力)系関数
関数の頭に何もつかないPrint系関数は標準出力に出力します。
func Print(a ...any) (n int, err error)
任意の数の
any
型(
interface{}
型)の引数を受け取り、改行なしで出力します。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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) } |
出力結果は以下の通り。
1 | 1abcdefg{1 2}1abcdefg{1 2} |
このように、改行されずにすべて1行で出力されます。また、カンマ区切りで複数の値を渡した場合でも、とくにスペースなどで区切られずそのまま出力されます。
func Printf(format string, a ...any) (n int, err error)
第1引数でフォーマットを指定し、第2引数以降で渡したデータをフォーマットに沿って埋め込んで出力します。
1 2 3 4 5 6 7 8 9 10 | 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 | [1] [abcdefg] [{1 2}] |
フォーマットの書式指定子(「%s」など)については、後ほど紹介します。
func Println(a ...any) (n int, err error)
任意の数の
any
型(
interface{}
型)の引数を受け取り、末尾改行込で出力します。
1 2 3 4 5 6 7 8 9 10 11 12 | 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) } |
出力結果は以下の通りです。
1 2 3 | abcdefg {1 2} 1 abcdefg {1 2} |
出力が改行される以外はPrint関数と同じです。
Sprint(文字列を出力)系関数
関数の頭が「S」から始まるSprint系関数は、文字列として出力します。
func Sprint(a ...any) string
任意の数の
any
型(
interface{}
型)の引数を受け取り、文字列型を返します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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) } |
出力結果は以下の通り。
1 2 3 | abcdefg {1 2} 1abcdefg{1 2} |
func Sprintf(format string, a ...any) string
第1引数でフォーマットを指定し、第2引数以降で渡したデータをフォーマットに沿って埋め込んで文字列型を返します。
1 2 3 4 5 6 7 8 9 10 11 | 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 | [1] [abcdefg] [{1 2}] |
func Sprintln(a ...any) string
任意の数の
any
型(
interface{}
型)の引数を受け取り、末尾改行込で文字列型を返します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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) } |
出力結果は以下の通りです。
1 2 3 | abcdefg {1 2} 1 abcdefg {1 2} |
Fprint(ファイルへ出力)系関数
関数の頭が「F」から始まるFprint系関数は、ファイルへ出力します。3つの関数はいずれも第1引数にファイル(
io.Writer
型)を受け取ります。
func Fprint(w io.Writer, a ...any) string
任意の数の
any
型(
interface{}
型)の引数を受け取り、ファイルへ出力します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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
)に出力しています。出力結果は以下の通り。
1 | 1abcdefg{1 2} |
func Fprintf(w io.Writer, format string, a ...any) string
第2引数でフォーマットを指定し、第3引数以降で渡したデータをフォーマットに沿って埋め込んで文字列型を返します。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 | [1] [abcdefg] [{1 2}] |
func Fprintln(w io.Writer, a ...any) string
任意の数の
any
型(
interface{}
型)の引数を受け取り、末尾改行込で文字列型を返します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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
)に出力しています。出力結果は以下の通りです。
1 2 3 | 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系関数について紹介しました。