
構造体の出力結果をカスタマイズする方法ってあるのかな?
今回は構造体の出力結果をカスタマイズして、あなた好みの出力結果を表示してみましょう。
そして、fmtパッケージの Sprintf()
関数についても理解していきます。
Go言語の構造体の出力結果をカスタマイズする
Go言語の構造体の出力結果をカスタマイズするには、fmtパッケージで定義されている Stringer
を活用していきます。
Stringerとは?
Stringer
はfmtパッケージで定義されたインターフェースで、文字列に関する出力結果を自由にカスタマイズできる機能を持っています。
では、fmtパッケージではどのように定義されているのでしょうか。
// fmtパッケージで定義されているStringer
type Stringer interface {
String() string
}
Stringer
の String()
関数をメソッドとして使用することで、Stringer
を使うことができます。
最初に出力結果がカスタマイズされていない状態を確認
まずは、出力結果をカスタマイズしていない状態を確認してみましょう。
// 出力結果がカスタマイズされていない状態
package main
import "fmt"
type Member struct {
Name string
Age int
}
func main() {
user1 := Member{
Name: "もりぴ",
Age: 51,
}
fmt.Println(user1)
}
// 出力結果
$ go run main.go
{もりぴ 51}

よく見かける、普通の出力結果ですね。
Stringerを使用してカスタマイズした場合
では、Stringer
を使用してカスタマイズします。
先程、説明した通り String()
を使用することで Stringer
を実装することができます。
// Stringerを使用してカスタマイズ
package main
import "fmt"
type Member struct {
Name string
Age int
}
// String()をメソッドとして使用しStringerを実装
func (a Member) String() string {
return fmt.Sprintf("私の名前は%vで、年齢は%vです。", a.Name, a.Age)
}
func main() {
user1 := Member{
Name: "もりぴ",
Age: 51,
}
fmt.Println(user1)
}
// 出力結果
$ go run main.go
私の名前はもりぴで、年齢は51です。
main関数
の fmt.Println(user1)
はそのままに、出力結果がカスタマイズされて表示されているのが確認できます。
レシーバーで構造体 Member
と String()
をメソッドにすることで、fmt.Println(user1)
が実行される段階で String()
の戻り値が表示されます。

なんか不思議な感じですね!
例えば、構造体にデータとして収めておいても良いけれど、出力結果として表示したくない場合にも応用できます。

私の年齢隠してもらえないかな!!
// Stringerを使用してカスタマイズ
package main
import "fmt"
type Member struct {
Name string
Age int
}
// String()をメソッドとして使用しStringerを実装
func (a Member) String() string {
return fmt.Sprintf("私の名前は%vです。", a.Name)
}
func main() {
user1 := Member{
Name: "もりぴ",
Age: 51,
}
fmt.Println(user1)
}
// 出力結果
$ go run main.go
私の名前はもりぴです。
という感じで、自由にカスタマイズできます。
Sprintf()関数とは?

先程のプログラムの Sprintf()
って見たことないけど…
当ブログで出力に使用していたのは、fmtパッケージの Println()
と Printf()
でした。
先程のプログラムで使用していた Sprintf()
関数とは、いったいどんな関数なのでしょう。
Sprintf()
関数はfmtパッケージで用意され Printf()
関数と同様に書式指定子を用いて出力する関数です。
Printf()
関数との違いは Printf()
関数は画面などに出力しますが、Sprintf()
関数は変数に代入したり関数の戻り値などへstring型として出力します。
なので、先程のプログラムの戻り値として string
が指定されています。
// 戻り値がstringであることを確認
func (a Member) String() string {
return fmt.Sprintf("私の名前は%vです。", a.Name)
}
【まとめ】Go言語の構造体の出力結果をカスタマイズする
それでは、まとめにはいります。
今回は Stringer
を利用して構造体の出力結果をカスタマイズしましたが、Stringer
は他にも文字列型の出力結果を自由に変更したい場面で使用できます。
Go言語のパッケージにはまだまだ便利な定義が用意されています。
私もそうなんですが…Go言語のプログラムを書いて徐々に覚えていきましょう。

私が勉強したパッケージの関数はブログで共有していきます!
comment