Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mencetak Nilai Struktur Bersarang dengan Penunjuk dalam Go?

Bagaimana untuk Mencetak Nilai Struktur Bersarang dengan Penunjuk dalam Go?

Patricia Arquette
Patricia Arquetteasal
2024-12-29 21:24:11206semak imbas

How to Print the Values of Nested Structs with Pointers in Go?

Mencetak Nilai Struktur dengan Penunjuk dalam Go

Dalam Go, adalah perkara biasa untuk menghadapi situasi di mana anda perlu mencetak nilai struct yang mengandungi penunjuk kepada struct lain. Walau bagaimanapun, kelakuan lalai penentu format %v dalam fmt.Printf() memaparkan alamat penuding dan bukannya nilai sebenar.

Pertimbangkan contoh berikut:

package main

import "fmt"

type A struct {
    a int32
    B *B
}
type B struct {
    b int32
}

func main() {
    a := &A{
        a: 1,
        B: &B{
            b: 2,
        },
    }
    fmt.Printf("v ==== %+v \n", a)
}

Output bagi kod di atas ialah:

v ==== &{a:1 B:0xc42000e204}

Seperti yang anda lihat, medan B dicetak sebagai alamat memori bagi struct B, bukan nilai sebenar.

Pencetakan Tersuai dengan Antara Muka Stringer

Salah satu cara untuk mencetak kandungan struct bersarang adalah dengan melaksanakan antara muka Stringer untuk kedua-dua jenis A dan B . Antara muka Stringer memerlukan satu kaedah, String(), yang mengembalikan perwakilan rentetan nilai.

Berikut ialah contoh yang dikemas kini dengan antara muka Stringer:

package main

import "fmt"

type A struct {
    a int32
    B *B
}

type B struct{ b int32 }

func (aa *A) String() string {
    return fmt.Sprintf("A{a:%d, B:%v}",aa.a,aa.B)
}

func (bb *B) String() string {
    return fmt.Sprintf("B{b:%d}",bb.b)
}

func main() {
    a := &A{a: 1, B: &B{b: 2}}

    // using the Stringer interface
    fmt.Printf("v ==== %v \n", a)

    // or just print it yourself however you want.
    fmt.Printf("v ==== A{a:%d, B:B{b:%d}}\n", a.a, a.B.b)

    // or just reference the values in the struct that are structs themselves
    // but this can get really deep
    fmt.Printf("v ==== A{a:%d, B:%v}", a.a, a.B)
}

Sekarang, output ialah :

v ==== A{a:1, B:B{b:2}}

Pencetakan Manual

Jika anda tidak mahu melaksanakan antara muka Stringer, anda boleh mencetak secara manual perwakilan struktur yang dikehendaki menggunakan pernyataan cetakan. Contohnya, anda boleh mengakses medan struct bersarang dan mencetaknya secara berasingan:

fmt.Printf("v ==== A{a:%d, B:B{b:%d}}\n", a.a, a.B.b)

Pendekatan ini memberi anda kawalan sepenuhnya ke atas format output.

Atas ialah kandungan terperinci Bagaimana untuk Mencetak Nilai Struktur Bersarang dengan Penunjuk dalam Go?. 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