Mengapa `fmt.Println` Tidak Menggunakan Kaedah `String()` Struct Saya?

Susan Sarandon
Lepaskan: 2024-11-22 05:03:15
asal
377 orang telah melayarinya

Why Doesn't `fmt.Println` Use My Struct's `String()` Method?

Menyingkap Misteri: Mengapa fmt.Println Melangkau Kaedah String() dalam Structs

Bayangkan dilema: anda mentakrifkan kaedah String() untuk struct untuk menyediakan tersuai tingkah laku percetakan, tetapi fmt.Println nampaknya mengabaikannya, meninggalkan anda dengan output tidak boleh dibaca. Ini adalah kes dengan kod berikut:

package main

import (
    "fmt"
)

type bar struct {
}

func (b bar) String() string {
    return "bar"
}

type foo struct {
    b []*bar
    bb *bar
}

func main() {
    f := foo{b: []*bar{&bar{}}, bb: &bar{}}
    fmt.Println(f, f.b, f.bb)
}
Salin selepas log masuk

Output Jangkaan:

{bar bar} [bar] bar
Salin selepas log masuk
Salin selepas log masuk

Output Sebenar:

{[0x176f44] 0x176f44} [bar] bar
Salin selepas log masuk

Merungkai Sebab

Terdapat dua faktor utama di sebalik ini tingkah laku:

  • Jenis yang tidak dieksport: Jenis bar tidak dieksport, bermakna ia hanya boleh digunakan dalam pakej yang sama. Apabila jenis yang tidak dieksport dibenamkan dalam struct yang dieksport seperti foo, kaedah mereka juga tidak dieksport.
  • Medan yang tidak dieksport: Medan b dan bb dalam foo tidak dieksport, yang bermaksud kaedah String() mereka tidak boleh boleh diakses oleh fmt.Println.

Mencerahkan Penyelesaian

Untuk membetulkannya, kita perlu menjadikan kedua-dua jenis bar dan medan foo dieksport. Berikut ialah kod yang diperbetulkan:

type Bar struct {
}

func (b Bar) String() string {
    return "bar"
}

type foo struct {
    B  []Bar
    BB Bar
}

func main() {
    f := foo{B: []Bar{Bar{}}, BB: Bar{}}
    fmt.Println(f)
}
Salin selepas log masuk

Taman Permainan: https://play.golang.org/p/OhoIcB7cA3

Ini memastikan kedua-dua Bar dan kaedah String()nya dieksport, membenarkan fmt.Println untuk menggunakannya. Akibatnya, kami memperoleh output yang diingini:

{bar bar} [bar] bar
Salin selepas log masuk
Salin selepas log masuk

Sebagai kesimpulan, ingat untuk mengeksport kedua-dua jenis dan medan yang terlibat dalam kaedah String() untuk membolehkan fmt.Println memanfaatkan ciri pemformatan tersuai yang berkuasa ini.

Atas ialah kandungan terperinci Mengapa `fmt.Println` Tidak Menggunakan Kaedah `String()` Struct Saya?. 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