首頁 > 後端開發 > Golang > 如何跨套件存取 Go 中的私有結構體欄位?

如何跨套件存取 Go 中的私有結構體欄位?

Patricia Arquette
發布: 2024-12-22 04:26:11
原創
162 人瀏覽過

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

跨套件存取私有結構欄位

在 Go 中,使用私有結構欄位封裝資料以強制資料隱藏是常見的做法。但是,在某些情況下,可能需要從另一個套件存取這些私有字段,例如出於白盒測試目的。

基於反射的方法(Go

使用反射,可以讀取 1.7 之前的 Go 版本中的私有結構體欄位。這是一個範例:

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())
}
登入後複製

此方法允許您讀取私有字段,但嘗試修改它們將導致恐慌。

基於不安全的方法(Go ≥ 1.7)

在Go 1.7 及更高版本中,可以採用使用unsafe 套件的更直接的方法來讀取和修改私有結構字段。但是,不鼓勵這種方法,因為它依賴低階指標操作,並且很容易導致記憶體損壞和其他問題。以下是範例:

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
}
登入後複製

替代方法

為了在促進白盒測試的同時保持封裝性,請考慮以下替代方法:

  • 暴露一個專用方法:導出原包中提供受控的方法存取私有欄位。
  • 使用嵌入類型:在需要存取私有欄位的套件中建立嵌入類型,並匯出該嵌入類型。

以上是如何跨套件存取 Go 中的私有結構體欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板