Rumah >pembangunan bahagian belakang >Golang >Mengapakah fmt.Println Mendapat Car.String() untuk Penunjuk tetapi Bukan Nilai?

Mengapakah fmt.Println Mendapat Car.String() untuk Penunjuk tetapi Bukan Nilai?

Linda Hamilton
Linda Hamiltonasal
2024-12-07 06:42:14401semak imbas

Why Does fmt.Println Invoke Car.String() for Pointers but Not Values?

Invoked String() untuk Mencetak Objek dengan fmt.Println

Apabila berurusan dengan antara muka fmt.Println dan Stringer, memahami proses penukaran jenis adalah penting.

Dalam kod yang disediakan, Car.String() ialah digunakan semasa mengendalikan penunjuk, tetapi tidak apabila menggunakan nilai. Ini kerana fmt.Println memaksa kedua-dua penunjuk dan nilai ke dalam jenis{} antara muka.

fmt kemudian melakukan penukaran jenis untuk menentukan cara mencetak nilai. Untuk nilai yang melaksanakan fmt.Stringer (dengan kaedah String mengembalikan rentetan), ia mencetak hasil kaedah itu. Walau bagaimanapun, untuk nilai dengan kaedah Rentetan yang ditakrifkan pada jenis penuding, penukaran jenis gagal.

Penyelesaian:

Untuk menyelesaikan masalah ini, sama ada laksanakan String pada jenis Kereta atau hantar penuding ke fmt.Println, seperti yang dilihat di bawah:

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) // Passing the pointer explicitly
}

Sebagai alternatif, anda boleh menggunakan penegasan jenis tersuai untuk menggunakan String secara manual, tetapi pendekatan ini tidak disyorkan:

func main() {
    myCar := Car{year: 1996, make: "Toyota"}
    if v, ok := myCar.(fmt.Stringer); ok {
        fmt.Println(v.String()) // Manually invoking String
    }
}

Dengan menangani kelakuan penukaran jenis fmt.Println, anda boleh mengawal cara objek diformatkan dengan berkesan, tanpa mengira nilai atau sifat penunjuk.

Atas ialah kandungan terperinci Mengapakah fmt.Println Mendapat Car.String() untuk Penunjuk tetapi Bukan Nilai?. 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