Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Mengakses Medan Struktur Persendirian dalam Pakej Go Across?

Bagaimanakah Saya Boleh Mengakses Medan Struktur Persendirian dalam Pakej Go Across?

Patricia Arquette
Patricia Arquetteasal
2024-12-22 04:26:11225semak imbas

How Can I Access Private Struct Fields in Go Across Packages?

Mengakses Medan Struktur Peribadi Merentasi Pakej

Dalam Go, adalah amalan biasa untuk merangkum data menggunakan medan struct peribadi untuk menguatkuasakan penyembunyian data. Walau bagaimanapun, mungkin terdapat situasi yang perlu untuk mengakses medan peribadi ini daripada pakej lain, seperti untuk tujuan ujian kotak putih.

Pendekatan Berasaskan Refleksi (Go < 1.7)

Menggunakan refleksi, adalah mungkin untuk membaca medan struct peribadi dalam versi Go sebelum 1.7. Berikut ialah contoh:

import (
    "fmt"
    "reflect"

    "github.com/other-package/foo"
)

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

Pendekatan ini membolehkan anda membaca medan peribadi tetapi percubaan untuk mengubah suainya akan mengakibatkan panik.

Pendekatan Berasaskan Tidak Selamat (Go ≥ 1.7)

Dalam Go 1.7 dan lebih baru, pendekatan yang lebih langsung menggunakan pakej tidak selamat boleh digunakan untuk membaca dan mengubah suai medan struct persendirian. Walau bagaimanapun, kaedah ini tidak digalakkan kerana ia bergantung pada manipulasi penunjuk peringkat rendah dan boleh membawa kepada kerosakan ingatan dan isu lain dengan mudah. Berikut ialah contoh:

import (
    "unsafe"

    "github.com/other-package/foo"
)

func changeFoo(f *foo.Foo) {
    ptrTof := unsafe.Pointer(f)
    ptrTof = unsafe.Pointer(uintptr(ptrTof) + unsafe.Sizeof(foo.Foo{}.x))
    ptrToy := (**foo.Foo)(ptrTof)
    *ptrToy = nil
}

Pendekatan Alternatif

Untuk mengekalkan enkapsulasi sambil memudahkan ujian kotak putih, pertimbangkan alternatif ini:

  • Dedahkan kaedah khusus: Eksport kaedah dalam pakej asal yang menyediakan akses terkawal kepada medan peribadi.
  • Gunakan jenis terbenam: Buat jenis terbenam dalam pakej yang memerlukan akses kepada medan peribadi dan eksport jenis terbenam itu.

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