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!