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

Barbara Streisand
Lepaskan: 2024-11-04 19:37:02
asal
787 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan