Golang_fmt.PrintlnとStringerインターフェース #469

fmt.Stringerインターフェースは、標準ライブラリのfmtパッケージで定義されているインターフェースで、Stringメソッドを持ちます。このStringメソッドは、その型のインスタンスを文字列として表現するためのカスタムフォーマットを提供します。

fmt.Stringerインターフェース

fmt.Stringerインターフェースは、たった1つのメソッドString()を持ちます。このメソッドは、構造体や任意の型を文字列としてフォーマットするために使用されます。

type Stringer interface {
    String() string
}

fmt.Printlnの動作

fmt.Println関数は、渡された引数がfmt.Stringerインターフェースを実装しているかどうかをチェックします。実装している場合、そのStringメソッドを呼び出して、戻り値の文字列を出力します。

コード例

実際のコードで見てみます。まずはStringメソッドを実装しない、通常通りのバージョンです。

type Person2 struct {
	Name string
	Age  int
}
 
func main() {
	a2 := Person2{"22Arthur Dent", 42}
	z2 := Person2{"22Zaphod Beeblebrox", 9001}
	fmt.Println(a2, z2)	
}

出力結果は以下になります。

{22Arthur Dent 42} {22Zaphod Beeblebrox 9001}


次に、Stringメソッドを実装してStringerインターフェースを満たしたバージョンです。

type Person2 struct {
	Name string
	Age  int
}

func (p Person2) String() string {
	return fmt.Sprintf("%v (%v yearssssss)", p.Name, p.Age)
}
 
func main() {
	a2 := Person2{"22Arthur Dent", 42}
	z2 := Person2{"22Zaphod Beeblebrox", 9001}
	fmt.Println(a2, z2)	
}

出力結果は以下になります。

22Arthur Dent (42 yearssssss) 22Zaphod Beeblebrox (9001 yearssssss)

出力内容をカスタマイズすることができました!

ちなみにここでのStringメソッドで使っているfmt.Sprintfは、フォーマット指定子を使用して文字列を構築するための関数です。

ここまでお読みいただきありがとうございました。

参考


この記事が気に入ったらサポートをしてみませんか?