Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah Menggunakan `% v` dalam Kaedah `String()` Nested Struct` Membawa kepada Limpahan Tindanan?

Mengapakah Menggunakan `% v` dalam Kaedah `String()` Nested Struct` Membawa kepada Limpahan Tindanan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-04 12:20:02937semak imbas

Why Does Using `% v` in a Nested Struct's `String()` Method Lead to a Stack Overflow?

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!

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