Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Mengakses Medan Struktur Peribadi dalam Go daripada Pakej Luaran?

Bagaimanakah Saya Boleh Mengakses Medan Struktur Peribadi dalam Go daripada Pakej Luaran?

Linda Hamilton
Linda Hamiltonasal
2024-12-21 01:59:09559semak imbas

How Can I Access Private Struct Fields in Go from External Packages?

Mengakses Medan Struktur Peribadi daripada Pakej Luaran

Dalam Go, medan peribadi struct bertujuan untuk tidak boleh diakses di luar pakej di mana ia berada ditakrifkan. Walau bagaimanapun, terdapat situasi apabila mungkin perlu untuk mengakses medan peribadi ini daripada pakej lain, seperti untuk tujuan ujian.

Menggunakan Refleksi

Satu cara untuk mengakses peribadi medan dari pakej lain menggunakan refleksi. Refleksi melibatkan pemeriksaan struktur dalaman objek semasa runtime. Coretan kod berikut menunjukkan cara membaca medan peribadi menggunakan refleksi dalam versi Go sebelum 1.7:

import (
    "fmt"
    "reflect"
)

func read_foo(f *Foo) {
    v := reflect.ValueOf(*f)
    y := v.FieldByName("y")
    fmt.Println(y.Interface())
}

Menggunakan Tidak Selamat

In Go versi 1.7 dan lebih baru, mengakses medan persendirian menggunakan refleksi dianggap tidak selamat. Sebagai alternatif, anda boleh menggunakan pakej yang tidak selamat untuk memintas sekatan akses. Walau bagaimanapun, kaedah ini amat tidak digalakkan kerana ia tidak mudah alih dan boleh membawa kepada tingkah laku yang tidak dijangka jika struktur objek berubah.

Coretan kod berikut menunjukkan cara menggunakan tidak selamat untuk mengakses dan mengubah suai medan peribadi:

import "unsafe"

func change_foo(f *Foo) {
    // Advance pointer by field size to reach desired member
    ptrTof := unsafe.Pointer(f)
    ptrTof = unsafe.Pointer(uintptr(ptrTof) + uintptr(8)) // 8 is the size of an int on a 64-bit machine
    ptrToy := (**Foo)(ptrTof)
    *ptrToy = nil // Nullify y
}

Alternatif

Secara amnya disyorkan untuk mengelak daripada mengakses peribadi medan daripada pakej luaran, kerana ia melanggar prinsip enkapsulasi. Sebaliknya, pertimbangkan alternatif berikut:

  • Alihkan fungsi ujian ke dalam pakej yang sama seperti medan peribadi.
  • Eksport antara muka atau sediakan kaedah pengambil/penetap untuk membenarkan akses luaran kepada subset data peribadi.

Ujian Kotak Putih Pertimbangan

Jika anda menjalankan ujian kotak putih, menggunakan pantulan atau tidak selamat mungkin boleh diterima kerana anda mempunyai akses kepada kod sumber. Dalam kes sedemikian, anda boleh membuat pakej ujian berasingan yang mentakrifkan fungsi untuk mengakses medan peribadi. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa ujian ini tidak akan bersifat hermetik dan mungkin berkelakuan di luar jangkaan jika struktur objek berubah.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengakses Medan Struktur Peribadi dalam Go daripada Pakej Luaran?. 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