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!