Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Tidak Mengesan Kekaburan dalam String() Kaedah Invocation untuk Struktur Terbenam pada Masa Penyusunan?

Mengapa Tidak Mengesan Kekaburan dalam String() Kaedah Invocation untuk Struktur Terbenam pada Masa Penyusunan?

Linda Hamilton
Linda Hamiltonasal
2024-11-26 03:05:10147semak imbas

Why Doesn't Go Detect Ambiguity in String() Method Invocation for Embedded Structs at Compile Time?

Invokasi Kaedah Pelik untuk Struktur Terbenam dalam Go: Memahami String()

Dalam Go, struct terbenam mewarisi kaedah jenis terbenamnya. Walau bagaimanapun, apabila berbilang jenis terbenam mentakrifkan kaedah dengan nama yang sama, kesamaran timbul. Mari kita terokai tingkah laku ini dengan memfokuskan pada kaedah String() khususnya.

Dalam kod contoh yang disediakan:

type Engineer struct {
    Person
    TaxPayer
    Specialization string
}

type Person struct {
    Name string
    Age  int
}

func (p Person) String() string {
    return fmt.Sprintf("name: %s, age: %d", p.Name, p.Age)
}

type TaxPayer struct {
    TaxBracket int
}

func (t TaxPayer) String() string {
    return fmt.Sprintf("%d", t.TaxBracket)
}

Apabila struct Jurutera dicetak menggunakan fmt.Println(jurutera), output berbeza-beza bergantung pada kehadiran kaedah String() dalam jenis terbenam.

Dengan Person.String():

  • fmt memanggil Person.String() kerana ia mempunyai kedalaman paling cetek dalam jenis Jurutera.
  • Outputnya ialah: "{name: John Doe, umur: 35 3 Pembinaan}"

Tanpa Person.String():

  • fmt memanggil TaxPayer.String() kerana ia adalah satu-satunya kaedah String() yang dipromosikan.
  • Outputnya ialah: "3"

Tanpa Kedua-dua Rentetan() Kaedah:

  • Tiada kaedah String() boleh dipromosikan daripada jenis terbenam.
  • fmt mencetak nilai medan lalai: "{{John Doe 35} {3} Pembinaan}"

Senario ini menyerlahkan peraturan kedalaman dan penyelesaian kekaburan untuk kaedah digalakkan dalam Go. Walau bagaimanapun, timbul persoalan mengapa kekaburan tidak dikesan pada masa penyusunan apabila berbilang kaedah String() dengan kedalaman sifar hadir.

Semakan Pemilih Ambigu:

Biasanya, apabila cuba menggunakan kaedah dengan pemilih yang tidak jelas, seperti jurutera.Foo(), ralat masa kompilasi berlaku. Walau bagaimanapun, ini tidak berlaku dengan kaedah bernama String().

Sebab:

Apabila mencetak nilai tanpa memanggil kaedah String() secara eksplisit, fmt.Println fungsi menyemak jika nilai melaksanakan fmt.Stringer. Ia kemudian memanggil kaedah String() yang dilaksanakan. Memandangkan semua jenis Go secara tersirat melaksanakan Stringer secara lalai (https://golang.org/doc/go1.19#fmt), sentiasa ada kaedah String() yang dipromosikan untuk sebarang jenis.

Kesimpulan :

Kekaburan dalam penggunaan kaedah untuk struktur terbenam timbul disebabkan oleh peraturan kedalaman dan pengendalian khas bagi kaedah String() untuk mencetak nilai. Dengan memahami peraturan ini dan perbezaan halus dalam promosi kaedah, pembangun boleh mengelakkan tingkah laku yang tidak dijangka dan mengekalkan kejelasan kod dalam program Go.

Atas ialah kandungan terperinci Mengapa Tidak Mengesan Kekaburan dalam String() Kaedah Invocation untuk Struktur Terbenam pada Masa Penyusunan?. 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