Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mengelakkan Ralat Limpahan Tindanan dengan `fmt.Sprintf(\"% v\")` dalam Nested Go Structs?

Bagaimana untuk Mengelakkan Ralat Limpahan Tindanan dengan `fmt.Sprintf(\"% v\")` dalam Nested Go Structs?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-04 12:18:02791semak imbas

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

Goroutine Stack Overflow Ralat dengan Nested Structs dan fmt.Sprintf()

Isu timbul apabila menggunakan fmt.Sprintf() dengan " % v" penentu format dalam kaedah String() struct bersarang. Format "% v" memanggil kaedah String() bagi setiap jenis bersarang secara rekursif, membawa kepada rekursi tak terhingga dan ralat limpahan tindanan.

Pertimbangkan struct bersarang:

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

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

String () kaedah untuk ConfigOne ditakrifkan sebagai:

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

Apabila mencetak elemen struct bersarang dengan fmt.Sprintf("% v", c), format "% v" menggunakan nilai c.String( ), menyebabkan rekursi yang tidak berkesudahan.

Untuk mengelakkan pengulangan ini, bina rentetan secara manual yang mewakili struct bersarang, seperti yang ditunjukkan:

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

Pendekatan ini menghapuskan panggilan String() rekursif dan membolehkan anda untuk mengawal kandungan rentetan.

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Ralat Limpahan Tindanan dengan `fmt.Sprintf(\"% v\")` dalam Nested Go Structs?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn