golang String()/Stringerとは 使い方と注意点について
今回はgolangのStringerについて解説していきます。
Stringerとは
Go言語のコードを読み進めていくとString()というメソッドが使用されていることがあります。
String()は、Stringerインターフェースに定義されたカスタム型の文字列表現を定義するために使うメソッドです。このメソッドを実装することで、任意の型に対してfmt.Printlnなどの関数が呼ばれた際の文字列表現をカスタマイズすることができます。
Stringerインターフェースはfmtパッケージの中で定義されていて、以下のようにString()メソッドのみを持っています。
type Stringer interface {
String() string
}
golangの案件を探すならクラウドワークス テック
Stringerの使い方
ではStringerの具体的な使用例を見てみましょう。
type Person struct {
Name string
Age int
}
func (p Person) String() string {
return fmt.Sprintf("%v (%v years)", p.Name, p.Age)
}
func main() {
a := Person{"Arthur Dent", 42}
z := Person{"Zaphod Beeblebrox", 9001}
fmt.Println(a)
fmt.Println(z)
}
上記コードではPerson型にString()メソッドを実装しています。
Person型の変数をfmt.Printlnで出力すると、String()メソッドで定義したフォーマットの文字列が出力されます。
Arthur Dent (42 years)
Zaphod Beeblebrox (9001 years)
このようにStringerでカスタム型の文字列表現を定義することで、デバッグやログ出力が容易にかつ様々な形式で出力することができます。
Stringerの注意点
String()メソッド内での無限ループ
type Person struct {
Name string
}
func (p Person) String() string {
return fmt.Sprintf("Person: %v", p)
}
上記のコードではfmt.Sprintfの中でpを直接使用しているため、Stringメソッドが再帰的に呼ばれ無限ループに陥ります。
Stringメソッド内では、対象のオブジェクトを直接fmtパッケージの関数に渡すのではなく、オブジェクトのフィールドに直接アクセスする必要があります。
type Person struct {
Name string
}
func (p Person) String() string {
return fmt.Sprintf("Person: %v", p.Name)
}
String()メソッドを実装する際は、自己参照的な呼び出しをしないようにすることで、プログラムが無限ループに陥ることを防ぐように注意しましょう。
ポインタレシーバーか値レシーバーか
String()メソッドに限った話ではありませんが、メソッド宣言において値レシーバーとして実装するか、ポインタレシーバーとして実装するかによって挙動が変わります。
func (p *Person) String() string {
return fmt.Sprintf("Person: %v", p.Name)
}
String()メソッドではオブジェクトの状態を読み取るだけで、その状態を変更することがほとんどないため、値レシーバー採用するのがほとんどです。
しかし、大きな構造体の場合はコピーにコストがかかる場合はポインタレシーバーを使用することもあります。
golangをもっと詳しくなりたい方に
初めてのGo言語
Go言語の入門から応用まではこの一冊で網羅されています。説明も順序立てて説明されており完成度の高い参考書となっています。
詳解Go言語Webアプリケーション開発
こちらはGo言語の基礎知識を得たあとに読むことをすすめる本となっています。ハンズオン形式で手を動かしながら実装をしていくことができるため、実際の開発を意識しながらGo言語を学ぶことができます。
以下の記事では他にも筆者が実際に読んでおすすめしたい本をまとめています。
【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)
まだGo言語の勉強を始めていない方、全くの初心者の方にはこちらのUdemy教材が最もおすすめです。
この教材ではgolangの基礎について網羅的に学ぶことができます。ただ見て学ぶだけでなく、講座の中でアプリ作成まで行うことで学んだことの理解をさらに深めることができます。
現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発
個人的に最も勉強になったのは「現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発」という教材です。
本格的なレクチャーに入る前に、なぜGoなのか、なぜFintechなのかについて説明されていることで、Goの概念や意味について大枠から理解することができます。
以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。