次のネストされた構造体について考えてみましょう:
<code class="go">type ConfigOne struct { Daemon daemon } type daemon struct { Loglevel int Logfile string }</code>
String() 文字列メソッドは、構造体要素を文字列に変換します。
<code class="go">func (c ConfigOne) String() string { return fmt.Sprintf("%+v\n", c) }</code>
c.String() でネストされた構造体を出力する場合、次のようになります。エラーが発生します:
runtime: goroutine stack exceeds 1000000000-byte limit fatal error: stack overflow
このエラーは、再帰による過剰なスタック使用量を示します。再帰は、ネストされたデーモン構造体の String() を呼び出す % v 形式によって発生します。このプロセスは無限に繰り返され、スタック オーバーフローが発生します。
再帰を解決するには、String() メソッドで % v を使用しないでください。代わりに、以下に示すように文字列を手動で構築します。
<code class="go">func (c ConfigOne) String() string { //return fmt.Sprintf("%+v\n", c.Daemon.Loglevel) return fmt.Sprintf("%+v\n", c.Daemon) }</code>
デーモン構造体を明示的にフォーマットすることで、無限再帰を回避し、意図したデータが確実に出力されます。
以上が入れ子になった構造体を出力するとスタック オーバーフローが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。