Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mengelakkan Ralat Limpahan Tindanan dengan `fmt.Sprintf(\'% v\')` dalam Nested Go Structs?

Bagaimana untuk Mengelakkan Ralat Limpahan Tindanan dengan `fmt.Sprintf(\'% v\')` dalam Nested Go Structs?

Mary-Kate Olsen
Lepaskan: 2024-11-04 12:18:02
asal
859 orang telah melayarinya

How to Avoid Stack Overflow Errors with `fmt.Sprintf(

Goroutine Stack Overflow Ralat dengan Nested Structs dan fmt.Sprintf()

Isu timbul apabila menggunakan fmt.Sprintf() dengan " % v" penentu format dalam kaedah String() struct bersarang. Format "% v" memanggil kaedah String() bagi setiap jenis bersarang secara rekursif, membawa kepada rekursi tak terhingga dan ralat limpahan tindanan.

Pertimbangkan struct bersarang:

<code class="go">type ConfigOne struct {
    Daemon daemon
}

type daemon struct {
    Loglevel int
    Logfile string
}</code>
Salin selepas log masuk

String () kaedah untuk ConfigOne ditakrifkan sebagai:

<code class="go">func (c ConfigOne)String()  string{
    return fmt.Sprintf("%+v\n", c)
}</code>
Salin selepas log masuk

Apabila mencetak elemen struct bersarang dengan fmt.Sprintf("% v", c), format "% v" menggunakan nilai c.String( ), menyebabkan rekursi yang tidak berkesudahan.

Untuk mengelakkan pengulangan ini, bina rentetan secara manual yang mewakili struct bersarang, seperti yang ditunjukkan:

<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

Pendekatan ini menghapuskan panggilan String() rekursif dan membolehkan anda untuk mengawal kandungan rentetan.

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Ralat Limpahan Tindanan dengan `fmt.Sprintf(\'% v\')` dalam Nested Go Structs?. 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