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
Lepaskan: 2024-12-22 04:26:11
asal
202 orang telah melayarinya

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())
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan