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
Patricia Arquetteasal
2024-12-31 11:43:10467semak imbas

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
}

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

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!

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