Rumah >pembangunan bahagian belakang >Golang >Mengapa fmt.Println Tidak Menggunakan Kaedah String() Ahli Struct dalam Go?

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

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-23 07:47:27965semak imbas

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)
}

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

Ini berbeza daripada apa yang kami jangkakan, iaitu ialah:

{[bar] bar} [bar] bar

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)
}

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

{[bar] bar} [bar] bar

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!

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