ホームページ >バックエンド開発 >Golang >ネストされた Go Structs の `fmt.Sprintf(\'% v\')` でスタック オーバーフロー エラーを回避する方法

ネストされた Go Structs の `fmt.Sprintf(\'% v\')` でスタック オーバーフロー エラーを回避する方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-04 12:18:02856ブラウズ

How to Avoid Stack Overflow Errors with `fmt.Sprintf(

ネストされた構造体と fmt.Sprintf() での Goroutine スタック オーバーフロー エラー

この問題は、fmt.Sprintf() を " % v" ネストされた構造体の String() メソッド内の書式指定子。 "% v" 形式は、ネストされた各型の String() メソッドを再帰的に呼び出すため、無限再帰とスタック オーバーフロー エラーが発生します。

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

<code class="go">type ConfigOne struct {
    Daemon daemon
}

type daemon struct {
    Loglevel int
    Logfile string
}</code>

The String ConfigOne の () メソッドは次のように定義されています:

<code class="go">func (c ConfigOne)String()  string{
    return fmt.Sprintf("%+v\n", c)
}</code>

ネストされた構造要素を出力するときfmt.Sprintf("% v", c)、"% v" 形式は c.String() の値を使用するため、無限の再帰が発生します。

この再帰を回避するには、ネストされた文字列を表す文字列を手動で構築します。

<code class="go">func (c ConfigOne)String()  string{
    return fmt.Sprintf("Loglevel: %d, Logfile: %s\n", c.Daemon.Loglevel, c.Daemon.Logfile)
}</code>

このアプローチにより、再帰的な String() 呼び出しが排除され、文字列の内容を制御できるようになります。

以上がネストされた Go Structs の `fmt.Sprintf(\'% v\')` でスタック オーバーフロー エラーを回避する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。