Skip to content

Latest commit

 

History

History
192 lines (155 loc) · 7.05 KB

2.07.md

File metadata and controls

192 lines (155 loc) · 7.05 KB

2.7 fmtパッケージ

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()formatstringで受け取ります。この場合は、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 documentationRune 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)
}

fmtindexから別のものを見てみましょう。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、PrintPrintfPrintlnSprintSprintfSprintlnに見てきました。パターンがあることがわかりますね。Fprint(file print)というのもあります。これについては後で見ていきましょう。ウェブアプリケーションでレスポンスを出力する時が良いかもしれません。レスポンス出力するときとファイルに出力したいときは似ていますから。IO出力はinterfaceを受け付けるので何の値でも受け付けます。つまり、HTTPレスポンス出力でもファイルでもすることができます。これはポリモーフィズムの一種ですね。scanningとともにまた後で見ましょう。

fmtパッケージには色んな面白い関数たちがありますね!