Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Percetakan Struktur Bersarang Membawa kepada Limpahan Tindanan Goroutine dalam Go?

Mengapa Percetakan Struktur Bersarang Membawa kepada Limpahan Tindanan Goroutine dalam Go?

Barbara Streisand
Barbara Streisandasal
2024-11-04 19:37:02745semak imbas

Why Does Nested Struct Printing Lead to Goroutine Stack Overflow in Go?

Ralat Masa Jalan: Limpahan Tindanan Goroutine Disebabkan Struktur Bersarang

Apabila bekerja dengan struct bersarang dalam Go, adalah penting untuk mengetahui kemungkinan tindanan melimpah. Ini boleh berlaku apabila cuba mencetak struct bersarang menggunakan format yang bergantung pada kaedah String() struct.

Punca Punca:

Rekursi tak terhingga berlaku apabila kaedah String() struct cuba mencetak struct yang sama seperti salah satu medannya. Format %v dan % v menggunakan nilai String() jika ia wujud. Ini mewujudkan gelung tak terhingga, membawa kepada limpahan tindanan.

Contoh:

Pertimbangkan kaedah bersarang dan String() berikut:

<code class="go">type ConfigOne struct {
    // Daemon section from config file.
    Daemon daemon
}

type daemon struct {
    Loglevel int
    Logfile string
}

func (c ConfigOne) String() string {
    return fmt.Sprintf("%+v\n", c) // Uses %+v for nested structs
}</code>

Apabila cuba mencetak contoh ConfigOne menggunakan kaedah String() ini, ralat limpahan tindanan akan berlaku:

<code class="go">c := &modules.ConfigOne{}
c.Daemon.Loglevel = 1
c.Daemon.Logfile = "/tmp/test.log"
modules.Logger.Infoln(c.String())</code>

Penyelesaian:

Untuk mengelakkan infiniti rekursi dan limpahan tindanan, kaedah String() harus membina rentetan secara manual, menyatakan format yang dikehendaki untuk struct bersarang. Contohnya:

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

Dalam kes ini, kejelasan kaedah String() memformat medan bersarang tanpa menggunakan %v atau % v, menyelesaikan isu rekursi tak terhingga.

Atas ialah kandungan terperinci Mengapa Percetakan Struktur Bersarang Membawa kepada Limpahan Tindanan Goroutine dalam Go?. 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