入れ子構造体の `String()` メソッドで `% v` を使用するとスタック オーバーフローが発生するのはなぜですか?
Nov 04, 2024 pm 12:20 PM入れ子になった構造体 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 サイトの他の関連記事を参照してください。

人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか?

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか?

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか?

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は?

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか?

GOの実際のパフォーマンスを正確に反映するベンチマークを作成するにはどうすればよいですか?
