fmt
パッケージを見ていきましょう。同時にGo基本ライブラリドキュメントの見方も見ていきます。fmt
パッケージから始め、フォーマと出力や異なる出力のための関数を見ていきます。
package main
import (
"fmt"
)
var a int
var b string = "James Bond"
var c bool
var d bool = true
func main() {
e := 42
f := "Shaken not stirred"
g := `Miss Moneypenny says, "Helloooooo, James"` // backticks allow us to use a string raw literal
h := `Q says,
"I have some new toys for you, James."
`
fmt.Println(a)
fmt.Println(b)
fmt.Println(c)
fmt.Println(d)
fmt.Println(e)
fmt.Println(b, "says, ", f)
fmt.Println(g)
fmt.Println(h)
}
返り値:
0
James Bond
false
true
42
James Bond says, Shaken not stirred
Miss Moneypenny says, "Helloooooo, James"
Q says,
"I have some new toys for you, James."
型を出力するためのフォーマット出力を使っていきます。fmtのドキュメントを見てみましょう。indexをクリックすると、パッケージで使えるものの一覧が見られます。
func Errorf(format string, a ...interface{}) error
func Fprint(w io.Writer, a ...interface{}) (n int, err error)
func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)
func Fprintln(w io.Writer, a ...interface{}) (n int, err error)
func Fscan(r io.Reader, a ...interface{}) (n int, err error)
func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
func Fscanln(r io.Reader, a ...interface{}) (n int, err error)
func Print(a ...interface{}) (n int, err error)
func Printf(format string, a ...interface{}) (n int, err error)
func Println(a ...interface{}) (n int, err error)
func Scan(a ...interface{}) (n int, err error)
func Scanf(format string, a ...interface{}) (n int, err error)
func Scanln(a ...interface{}) (n int, err error)
func Sprint(a ...interface{}) string
func Sprintf(format string, a ...interface{}) string
func Sprintln(a ...interface{}) string
func Sscan(str string, a ...interface{}) (n int, err error)
func Sscanf(str string, format string, a ...interface{}) (n int, err error)
func Sscanln(str string, a ...interface{}) (n int, err error)
type Formatter
type GoStringer
type ScanState
type Scanner
type State
type Stringer
これまで、fmt.Println()を使ってきましたが、fmt.Printf()やfmt.Print()もあります。fmt.Println()
は改行を出力しますが、fmt.Print()
はしません。fmt.Printf()
はフォーマット出力をします。Printfはフォーマット指定子によってフォーマットされ、標準出力に出力されます。出力されたバイト数と起こったエラーを返り値として返します。
func Printf(format string, a ...interface{}) (n int, err error)
fmt.Printf()
はformat
をstring
で受け取ります。この場合は、format
はただの識別子で、string
である必要があるだけです。...interface{}
()
In this case, format
is just an identifier. It could have been called anything, but it needs to be of type string
and ...interface{}
(パラメータ...
と空のインターフェイスinterface{}
)どの方の引数をいくつでも受け取ることを意味します。
フォーマット出力のverbsとはなんでしょう?フォーマットの'verbs'はC言語からもたらされたものですが、よりシンプルになっています。
%v
は'int'や'string'、'bool'等の値を表示するのに便利です。
package main
import (
"fmt"
)
var a int
var b string = "James Bond"
//var c bool
//var d bool = true
func main() {
//e := 42
//f := "Shaken not stirred"
//g := `Miss Moneypenny says, "Helloooooo, James"` // バッククオートを使えばダブルクオートを文中で使えます
//h := `Q says,
//"I have some new toys for you, James."
//`
fmt.Printf("%v\n", a)
fmt.Printf("%v", b)
}
fmt.Println
と違い、fmt.Printf
は改行を出力しません。\n
を使えば改行することはできます。Go language spec documentationのRune Literalsでは、シングルキャラクターエスケープについて書かれています。
\a U+0007 alert or bell
\b U+0008 backspace
\f U+000C form feed
\n U+000A line feed or newline
\r U+000D carriage return
\t U+0009 horizontal tab
\v U+000b vertical tab
\\ U+005c backslash
\' U+0027 single quote (valid escape only within rune literals)
\" U+0022 double quote (valid escape only within string literals)
\n
と\t
の2つが最も使われるかと思います。
%v
以外では、%#v
もよく使います。Goの文法に則った値の表現をします。%T
は値の型を出力します。様々なエスケープや_verbs_を試してみてください。Go Playground
package main
import (
"fmt"
)
var a int
var b string = "James Bond"
func main() {
fmt.Printf("%v\n", a)
fmt.Printf("%v\n", b)
fmt.Printf("%#v\n", a)
fmt.Printf("%#v\n", b)
fmt.Printf("%T\n", a)
fmt.Printf("%T\n", b)
fmt.Printf("%T\t%T", a, b)
}
fmt
のindexから別のものを見てみましょう。fmt.Sprint()関数にしましょう。fmt.Sprint()
は__string__出力という意味です。string
を返すと書いてありますね。
Sprintf
はフォーマットにデフォルトの指定子を使い、結果のstring
を返します。
func Sprintf(format string, a ...interface{}) string
Go playgroundで試してみましょう。
package main
import (
"fmt"
)
var a int
var b string = "James Bond"
func main() {
fmt.Printf("%v\n", a)
fmt.Printf("%v\n", b)
fmt.Printf("%#v\n", a)
fmt.Printf("%#v\n", b)
fmt.Printf("%T\n", a)
fmt.Printf("%T\n", b)
fmt.Printf("%T\t%T\n", a, b)
s := fmt.Sprint(a, " something more ", b)
fmt.Println(s)
s2 := fmt.Sprintf("%v\t%T\t%T\n", "to pass in", a, b)
fmt.Println(s2)
}
OK、Print
、Printf
、Println
、Sprint
、Sprintf
、Sprintln
に見てきました。パターンがあることがわかりますね。Fprint
(file print)というのもあります。これについては後で見ていきましょう。ウェブアプリケーションでレスポンスを出力する時が良いかもしれません。レスポンス出力するときとファイルに出力したいときは似ていますから。IO出力はinterfaceを受け付けるので何の値でも受け付けます。つまり、HTTPレスポンス出力でもファイルでもすることができます。これはポリモーフィズムの一種ですね。scanningとともにまた後で見ましょう。
fmt
パッケージには色んな面白い関数たちがありますね!