Rumah > pembangunan bahagian belakang > Golang > Mengapa `fmt.Println` Tidak Memanggil Kaedah Antara Muka Stringer Saya Apabila Menggunakan Objek Bukan Penunjuk?

Mengapa `fmt.Println` Tidak Memanggil Kaedah Antara Muka Stringer Saya Apabila Menggunakan Objek Bukan Penunjuk?

DDD
Lepaskan: 2024-12-06 08:51:18
asal
527 orang telah melayarinya

Why Doesn't `fmt.Println` Call My Stringer Interface Method When Using a Non-Pointer Object?

Mengapa Kaedah Antara Muka Stringer Saya Tidak Dikenakan Apabila Saya Menggunakan fmt.Println?

Apabila bekerja dengan antara muka Stringer Go, pengguna mungkin menghadapi situasi di mana String( ) kaedah tidak dipanggil apabila menghantar objek bukan penunjuk ke fmt.Println. Untuk memberi penerangan tentang tingkah laku ini, mari kita periksa kod berikut:

package main

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

Di sini, kami mentakrifkan struct Kereta dan melaksanakan kaedah String() sebagai kaedah nilai. Walau bagaimanapun, apabila kita menyerahkan myCar sebagai hujah kepada fmt.Println, objek ditukar kepada antara muka{}. Ini menyebabkan pakej fmt menggunakan pemformatan lalainya sendiri, memintas kaedah String() kami.

Kunci untuk memahami tingkah laku ini terletak pada fakta bahawa kami telah melaksanakan kaedah String() pada penerima penuding (* Kereta). Apabila menghantar nilai jenis Kereta, pengkompil tidak menukarnya secara automatik kepada penunjuk. Oleh itu, pakej fmt tidak boleh memadankan kaedah String() kami dengan nilai yang kami hantar.

Sebaliknya, untuk menggunakan kaedah String() kami apabila menghantar objek bukan penuding, kami perlu menukar nilai secara manual kepada penunjuk menggunakan & operator:

fmt.Println(&myCar)
Salin selepas log masuk

Dengan berbuat demikian, kami menghantar penunjuk ke objek Kereta ke fmt.Println. Ini membolehkan kaedah String() penerima nilai digunakan dan pemformatan tersuai kami digunakan.

Ringkasnya, apabila bekerja dengan antara muka Stringer, adalah penting untuk diingat bahawa kaedah mesti ditakrifkan pada penerima yang betul taip. Untuk penunjuk, penerima penunjuk adalah sesuai, manakala untuk jenis nilai, penerima nilai boleh digunakan. Jika menghantar penunjuk secara manual tidak diingini, seseorang boleh mempertimbangkan untuk melaksanakan kaedah String() sebagai kaedah penunjuk pada struktur Kereta sebenar.

Atas ialah kandungan terperinci Mengapa `fmt.Println` Tidak Memanggil Kaedah Antara Muka Stringer Saya Apabila Menggunakan Objek Bukan Penunjuk?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan