Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah Kaedah `String()` Go Berkelakuan dengan Jenis Terbenam dan Pelbagai Kaedah Digalakkan?

Bagaimanakah Kaedah `String()` Go Berkelakuan dengan Jenis Terbenam dan Pelbagai Kaedah Digalakkan?

Barbara Streisand
Barbara Streisandasal
2024-11-21 12:59:13784semak imbas

How Does Go's `String()` Method Behave with Embedded Types and Multiple Promoted Methods?

Interaksi Kaedah String() yang Tidak Diduga dalam Jenis Go Terbenam

Memahami nuansa kelakuan kaedah String() dalam Go adalah penting apabila berfungsi dengan jenis terbenam. Pertimbangkan coretan kod berikut:

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)
}

func main() {
    engineer := Engineer{
        Person: Person{
            Name: "John Doe",
            Age:  35,
        },
        TaxPayer: TaxPayer{3},
        Specialization: "Construction",
    }
    fmt.Println(engineer)
}

Keluaran kod ini ialah "nama: John Doe, umur: 35 3 Pembinaan." Tingkah laku ini, pada mulanya membingungkan, boleh dijelaskan dengan mengkaji cara jenis terbenam berinteraksi dengan kaedah String().

Promosi Jenis Terbenam

Dalam Go, jenis terbenam membenarkan kemasukan medan dan kaedah daripada jenis lain. Apabila jenis membenamkan jenis lain, medan dan kaedah jenis terbenam dipromosikan kepada jenis pembenaman, berkelakuan seolah-olah ia ditakrifkan pada jenis pembenaman. Dalam contoh kami, jenis Jurutera membenamkan kedua-dua jenis Orang dan Pembayar Cukai.

Pemilihan Kaedah

Apabila kaedah String() dipanggil pada jenis terbenam, tingkah laku lalai ialah memilih kaedah paling cetek (paling tidak bersarang) dengan nama itu. Walau bagaimanapun, jika terdapat berbilang kaedah String() yang dipromosikan pada kedalaman yang sama, ungkapan pemilih menjadi menyalahi undang-undang, mengakibatkan ralat masa kompilasi.

Dalam kod yang disediakan, kedua-dua jenis Orang dan Pembayar Cukai mempunyai String() kaedah. Oleh itu, Engineer.String() ialah pemilih yang tidak sah. Akibatnya, tiada kaedah String() dipanggil terus semasa mencetak nilai Jurutera.

Penjanaan Rentetan Pakej fmt

Apabila tiada String() yang jelas kaedah yang ditakrifkan untuk jenis struct, pakej fmt kembali pada perwakilan rentetan lalai, yang termasuk mencetak nilai medan. Dalam struct Jurutera, ini menghasilkan output "nama: John Doe, umur: 35 3 Pembinaan."

Kesan Kaedah Mengalih Keluar

Menariknya, mengalih keluar mana-mana Orang .String() atau TaxPayer.String() menyelesaikan kekaburan, membenarkan kaedah String() yang tinggal digunakan untuk rentetan generasi. Ini menekankan kepentingan mempertimbangkan dengan teliti konvensyen penamaan kaedah apabila menggunakan jenis terbenam.

Kesimpulan

Kelakuan kaedah String() pada jenis terbenam menyerlahkan keperluan untuk kejelasan dan pandangan jauh semasa mentakrifkan kaedah. Dengan memahami mekanik pemilihan kaedah dan promosi, pembangun boleh mengelakkan pemilih yang samar-samar dan memastikan perwakilan rentetan yang konsisten bagi jenis mereka.

Atas ialah kandungan terperinci Bagaimanakah Kaedah `String()` Go Berkelakuan dengan Jenis Terbenam dan Pelbagai Kaedah Digalakkan?. 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