Mengapa fmt.Println Tidak Menggunakan Kaedah String() Ahli Struct dalam Go?

Mary-Kate Olsen
Lepaskan: 2024-11-23 07:47:27
asal
917 orang telah melayarinya

Why Doesn't fmt.Println Use a Struct's Member String() Methods in Go?

Memahami Tingkah Laku fmt.Println dengan Ahli Struktur

Dalam Go, apabila kami memanggil fmt.Println pada struct, kami menjangkakan ia akan keluar perwakilan rentetan ahli struct menggunakan kaedah String() masing-masing. Walau bagaimanapun, ini tidak selalu berlaku.

Pertimbangkan 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

Dalam kod ini, kami mentakrifkan jenis bar dengan kaedah String() yang mengembalikan rentetan "bar ." Kami juga mentakrifkan jenis foo dengan medan b dan bb, yang merupakan kepingan dan penunjuk kepada jenis bar, masing-masing.

Apabila kita memanggil fmt.Println pada f, f.b dan f.bb, kita mendapat output berikut :

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

Ini berbeza daripada apa yang kami jangkakan, iaitu ialah:

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

Sebab Di Sebalik fmt.Gelagat Println

Terdapat beberapa sebab mengapa fmt.Println tidak menggunakan kaedah String() ahli apabila dipanggil pada struct:

  • String() kaedah tidak dieksport: Kaedah String() dalam jenis bar tidak dieksport kerana ia bermula dengan huruf kecil. Jenis dan kaedah yang dieksport boleh diakses daripada pakej lain, manakala yang tidak dieksport tidak boleh.
  • Medan tidak dieksport: Medan b dan bb dalam jenis foo juga tidak dieksport kerana ia bermula dengan huruf kecil . Oleh itu, ia tidak boleh diakses daripada pakej lain dan tidak dicetak oleh fmt.Println.

Penyelesaian

Untuk membetulkannya, kita perlu memastikan bahawa kaedah String() dan medan dalam struct dieksport. Berikut ialah kod yang diperbetulkan:

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)
}
Salin selepas log masuk

Sekarang, apabila kita menjalankan kod, kita mendapat output yang dijangkakan:

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

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