Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Mencetak Struktur Bersarang Menyebabkan Limpahan Tindanan?

Mengapa Mencetak Struktur Bersarang Menyebabkan Limpahan Tindanan?

Barbara Streisand
Barbara Streisandasal
2024-11-04 17:01:02981semak imbas

Why Does Printing a Nested Struct Cause a Stack Overflow?

Penggunaan Tindanan Berlebihan Semasa Pencetakan Struktur Bersarang

Kaedah Struct dan String() Bersarang

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>

Rekursi dan Limpahan Tindanan

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.

Penyelesaian

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!

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