ホームページ > バックエンド開発 > Golang > 入れ子になった構造体を出力するとスタック オーバーフローが発生するのはなぜですか?

入れ子になった構造体を出力するとスタック オーバーフローが発生するのはなぜですか?

Barbara Streisand
リリース: 2024-11-04 17:01:02
オリジナル
1044 人が閲覧しました

Why Does Printing a Nested Struct Cause a Stack Overflow?

ネストされた構造体の印刷中の過剰なスタック使用量

ネストされた構造体と String() メソッド

次のネストされた構造体について考えてみましょう:

<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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート