Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Memulakan Struktur Terbenam dengan Cekap dalam Go?

Bagaimanakah Saya Boleh Memulakan Struktur Terbenam dengan Cekap dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-17 01:03:24761semak imbas

How Can I Efficiently Initialize Embedded Structs in Go?

Permulaan Struktur dengan Struktur Terbenam dalam Go

Mengarang struct ialah amalan biasa dalam organisasi kod dan penggunaan semula Go for. Walau bagaimanapun, memulakan struct yang digubah boleh memberikan cabaran apabila subfield diwarisi daripada struct terbenam.

Pertimbangkan contoh berikut:

type Base struct {
    ID string
}

type Child struct {
    Base
    a int
    b int
}

Untuk memulakan Child, seseorang mungkin mengharapkan untuk menggunakan yang berikut sintaks:

child := Child{ ID: id, a: a, b: b }

Walau bagaimanapun, ini akan mengakibatkan ralat kompilasi disebabkan ID medan yang tidak diketahui dalam struct Kanak-kanak literal. Untuk menyelesaikan isu ini, medan ID mesti dimulakan secara berasingan:

child := Child{ a: 23, b: 42 }
child.ID = "foo"

Pendekatan ini melanggar prinsip enkapsulasi dengan mendedahkan fakta bahawa ID ialah medan terbenam. Ia juga memperkenalkan risiko memecahkan permulaan jika medan awam dialihkan ke dalam struktur terbenam.

Untuk menangani isu ini, terdapat dua penyelesaian yang disyorkan:

  1. Tersurat Komposit Bersarang:

    Tersurat komposit bersarang boleh digunakan untuk memulakan tertanam medan dalam satu ungkapan:

    child := Child{Base: Base{ID: id}, a: a, b: b}
  2. Cadangan Perubahan dalam Go:

    Go isu 9859 mencadangkan perubahan untuk membuat literal komposit selaras dengan akses medan untuk jenis terbenam. Jika dilaksanakan, perubahan ini akan membenarkan sintaks berikut:

    child := Child{ ID: id, a: a, b: b }

Adalah penting untuk ambil perhatian bahawa jenis terbenam tidak menyediakan enkapsulasi dalam erti kata sebenar. Aplikasi masih boleh mengakses terus child.Base.ID walaupun menggunakan sintaks child.ID.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memulakan Struktur Terbenam dengan Cekap dalam Go?. 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