Rumah > pembangunan bahagian belakang > Golang > Mengapa `fmt.Println` Tidak Sentiasa Memanggil Kaedah `String()` Jenis Tersuai Saya?

Mengapa `fmt.Println` Tidak Sentiasa Memanggil Kaedah `String()` Jenis Tersuai Saya?

Patricia Arquette
Lepaskan: 2024-12-31 11:43:10
asal
464 orang telah melayarinya

Why Doesn't `fmt.Println` Always Call My Custom Type's `String()` Method?

Kegagalan Invokasi Kaedah dengan Penukaran Antara Muka dalam fmt.Println

Apabila cuba menggunakan fmt.Println untuk mencetak nilai jenis tersuai, penggunaan kaedah yang dijangka bagi kaedah String() jenis mungkin tidak berlaku. Isu ini timbul apabila nilai dihantar sebagai nilai dan bukannya penunjuk.

Pertimbangkan kod contoh:

import "fmt"

type Car struct {
    year int
    make string
}

func (c *Car) String() string {
    return fmt.Sprintf("{make:%s, year:%d}", c.make, c.year)
}

func main() {
    myCar := Car{year: 1996, make: "Toyota"}
    fmt.Println(myCar) // Value-based object
}
Salin selepas log masuk

Dalam keadaan ini, kaedah String() yang dijangkakan Kereta tidak akan dipanggil apabila fmt.Println digunakan dengan nilai jenis Kereta. Sebaliknya, nilai akan diformatkan menggunakan mekanisme pemformatan Go lalai.

Untuk menyelesaikan isu ini dan memastikan kaedah String() tersuai digunakan tidak kira sama ada objek itu nilai atau penunjuk, pilihan berikut tersedia:

  • Melaksanakan String() pada Jenis Berasaskan Nilai: Walaupun pendekatan ini menghapuskan keperluan untuk penukaran manual, ia dikenakan penalti prestasi kerana menyalin objek setiap kali kaedah String() dipanggil.
  • Sentiasa Hantar Penunjuk ke fmt.Println: Dengan menghantar penunjuk ke fmt.Println, Fungsi Println akan membatalkan rujukannya secara automatik dan menggunakan kaedah String() pada nilai asas. Ini memastikan pemformatan yang diingini digunakan tanpa mengira sama ada objek itu nilai atau penunjuk:
fmt.Println(&myCar) // Pointer-based object
Salin selepas log masuk

Dengan mematuhi garis panduan ini, anda boleh menggunakan kaedah String() dan mengawal pemformatan jenis tersuai dalam fmt.Println.

Atas ialah kandungan terperinci Mengapa `fmt.Println` Tidak Sentiasa Memanggil Kaedah `String()` Jenis Tersuai 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