Ralat Pencetakan Rekursif dalam Kaedah Nested Struct String()
Soalan ini meneroka isu limpahan tindanan apabila cuba mencetak struct bersarang menggunakan kaedah String() dengan penentu format % v.
Masalah:
Seorang pengguna cuba mengembalikan elemen struct bersarang dalam kaedah String() menggunakan kod berikut :
<code class="go">func (c ConfigOne) String() string { return fmt.Sprintf("%+v\n", c) }</code>
Apabila pengguna cuba mencetak struct menggunakan Logger.Infoln(c.String()), mereka menghadapi ralat:
runtime: goroutine stack exceeds 1000000000-byte limit fatal error: stack overflow
Penjelasan:
Format %v dan % v menggunakan nilai String() jika jenis itu melaksanakannya. Oleh itu, menggunakan % v pada jenis dalam fungsi String() untuk jenis itu menyebabkan rekursi tak terhingga.
Dalam kes ini, kaedah String() memanggil fmt.Sprintf("% v", c), yang memanggil kaedah String() secara rekursif pada struct Daemon terbenam, dan seterusnya. Ini membawa kepada gelung tak terhingga dan limpahan tindanan.
Penyelesaian:
Untuk mengatasi isu ini, pengguna tidak seharusnya menggunakan % v dalam fungsi String(). Sebaliknya, mereka harus membina rentetan mereka sendiri, menunjukkan kandungan struktur dalam apa jua cara yang mereka fikir sesuai. Contohnya:
<code class="go">func (c ConfigOne) String() string { return fmt.Sprintf("Loglevel: %d, Logfile: %s\n", c.Daemon.Loglevel, c.Daemon.Logfile) }</code>
Atas ialah kandungan terperinci Mengapakah Menggunakan `% v` dalam Kaedah `String()` Nested Struct` Membawa kepada Limpahan Tindanan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!