Rumah > Artikel > pembangunan bahagian belakang > Mengapa Mencetak Struktur Bersarang Menyebabkan Limpahan Tindanan?
Pertimbangkan struct bersarang berikut:
<code class="go">type ConfigOne struct { Daemon daemon } type daemon struct { Loglevel int Logfile string }</code>
Kaedah rentetan String() menukarkan elemen struct menjadi rentetan:
<code class="go">func (c ConfigOne) String() string { return fmt.Sprintf("%+v\n", c) }</code>
Apabila mencetak struct bersarang dengan c.String(), perkara berikut ralat berlaku:
runtime: goroutine stack exceeds 1000000000-byte limit fatal error: stack overflow
Ralat ini menunjukkan penggunaan tindanan yang berlebihan disebabkan pengulangan. Rekursi disebabkan oleh format % v, yang menggunakan String() untuk struct daemon bersarang. Proses ini berulang tanpa had, membawa kepada limpahan tindanan.
Untuk menyelesaikan rekursi, elakkan menggunakan % v dalam kaedah String(). Sebaliknya, bina rentetan secara manual, seperti yang ditunjukkan di bawah:
<code class="go">func (c ConfigOne) String() string { //return fmt.Sprintf("%+v\n", c.Daemon.Loglevel) return fmt.Sprintf("%+v\n", c.Daemon) }</code>
Dengan memformat struct daemon secara eksplisit, kami mengelakkan rekursi tak terhingga dan memastikan data yang dimaksudkan adalah output.
Atas ialah kandungan terperinci Mengapa Mencetak Struktur Bersarang Menyebabkan Limpahan Tindanan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!