首頁  >  文章  >  後端開發  >  如何在巢狀 Go 結構中使用 `fmt.Sprintf(\"% v\")` 避免堆疊溢位錯誤?

如何在巢狀 Go 結構中使用 `fmt.Sprintf(\"% v\")` 避免堆疊溢位錯誤?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-04 12:18:02791瀏覽

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>

字串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 結構中使用 `fmt.Sprintf(\"% v\")` 避免堆疊溢位錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn