入れ子になった構造体 String() メソッドの再帰的印刷エラー
この質問では、次を使用して入れ子になった構造体を印刷しようとしたときのスタック オーバーフローの問題について調査します。 % v 形式指定子を使用した String() メソッド。
問題:
ユーザーは、次のコードを使用して String() メソッドでネストされた構造体要素を返そうとします。 :
<code class="go">func (c ConfigOne) String() string { return fmt.Sprintf("%+v\n", c) }</code>
ユーザーが Logger.Infoln(c.String()) を使用して構造体を出力しようとすると、エラーが発生します:
runtime: goroutine stack exceeds 1000000000-byte limit fatal error: stack overflow
説明:
%v および % v 形式は、型が String() を実装している場合、その値を使用します。したがって、その型の String() 関数内でその型に対して % v を使用すると、無限再帰が発生します。
この場合、String() メソッドは fmt.Sprintf("% v", c) を呼び出します。埋め込まれたデーモン構造体に対して String() メソッドを再帰的に呼び出します。これにより、無限ループとスタック オーバーフローが発生します。
解決策:
この問題を解決するには、String() 関数で % v を使用しないでください。代わりに、独自の文字列を構築し、適切と思われる方法で構造体の内容を表示する必要があります。例:
<code class="go">func (c ConfigOne) String() string { return fmt.Sprintf("Loglevel: %d, Logfile: %s\n", c.Daemon.Loglevel, c.Daemon.Logfile) }</code>
以上が入れ子構造体の `String()` メソッドで `% v` を使用するとスタック オーバーフローが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。