プログラムの複数の段階で、値やその他のデータを表示する必要があったり、デバッグのために様々なデータを記録する必要があったりします。
このような基本的なデバッグは、より良いコードを書くために役立ちます。
fmtパッケージは、プリントのための様々な書式指定子をサポートしています。この投稿では、Golangのfmtパッケージについて説明します。
fmtパッケージをimportする
ここで説明する関数はfmtパッケージなので、それをインポートする必要があります。また、コンソールへの出力を行うので、同様にosパッケージを使用することにします。
import (
"fmt"
"os"
)
fmtパッケージで利用できる関数
fmtパッケージは、主に文字列の書式設定をサポートする読み書き関数で構成されています。以下は、このパッケージで利用可能な最もよく使われる関数である。
- Fprint, Fprintf, Fprintln
- Fscan, Fscanf, Fscanln
- Sprint, Sprintf, Sprintln
- Sscan, Sscanf, Sscanln
Fで始まるすべての関数は、引数として与えられたストリームに文字列を書き込んだり、そこから読み出したりします。引数は、用途に応じて io.Writer または io.Reader インターフェースを実装する必要があります。
Sで始まるすべての関数は、作成した文字列を書式指定子で返します。自動的に印刷されることはありません。
Fprintln や Fscanln など ln で終わる関数は、改行を追加します。
末尾にfが付く関数は、フォーマットをサポートしています。
GoLang fmt パッケージのprint関数
このパッケージが持っている関数のほとんどは可変型関数で、いくつでも引数を取ることができます。
ここでは、使用されている関数のいくつかを紹介します。
package main
import (
"fmt"
"os"
)
func main() {
v := 42
// Spaces are to be added manually
fmt.Print("This", "is", "a", 42, "string\n") // Thisisa42string
fmt.Println("Another", "string") // Another string
fmt.Printf("The value is %d\n", v) // The value is 42 // formatting support
s := "formatted"
// Spaces are to be added manually
// os.Stdout is an io.Writer
fmt.Fprint(os.Stdout, "Yet", "another", "string\n") // Yetanotherstring
fmt.Fprintln(os.Stdout, "A", "string") // A string
fmt.Fprintf(os.Stdout, "A %s string\n", s) // A formatted string
}
fmtパッケージのscan関数
スキャン関数は、標準入力から値を取得するために使用されます。
以下はその動作の一部です。
package main
import (
"fmt"
)
func main() {
var a, b int
// use address-of operator to get the values into the variable
fmt.Scan(&a, &b)
// print the values taken
fmt.Println(a, b)
}
Scanln機能は、下図と同じように使用することができます。
package main
import (
"fmt"
)
func main() {
var a, b int
// use address-of operator to get the values into the variable
fmt.Scanln(&a, &b)
fmt.Println(a, b)
}
前にSがつく関数は同じことをしますが、唯一の違いは、データを表示しない代わりに文字列を返すことです。
fmtパッケージのstringerインタフェース
stringerインターフェースの実装者は、print関数に引数として渡すだけで、定義されたとおりの印刷を行うことができます。
以下に、stringerインターフェースを実装した構造体の例を示します。
package main
import (
"fmt"
)
// define a struct
type Book struct{
Name string
Author string
}
// implement the stringer interface by
// implementing the String() string function
func (b Book)String() string {
return fmt.Sprintf("%s was written by %s\n", b.Name, b.Author)
}
func main() {
b := Book{
"1984",
"George Orwell",
}
// pass as argument directly
fmt.Println(b) // 1984 was written by George Orwell
}
このように、fmtパッケージはGoで最も重要なパッケージの一つであり、多くの便利な関数と型が提供されています。