ホームページ > バックエンド開発 > Golang > テストやその他の正当な目的で Go のプライベート フィールドにアクセスするにはどうすればよいですか?

テストやその他の正当な目的で Go のプライベート フィールドにアクセスするにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-19 09:36:10
オリジナル
997 人が閲覧しました

How Can I Access Private Fields in Go for Testing and Other Legitimate Purposes?

Go でのプライベート フィールドへのアクセス: フレンド パッケージとホワイト ボックス テストのソリューション

Go では、通常、構造体フィールドはデフォルトでプライベートです。外部パッケージによるアクセスから保護します。ただし、ホワイトボックス テストまたはその他の正当な理由で、別のパッケージからプライベート フィールドにアクセスする必要があるシナリオが存在する場合があります。

方法 1: リフレクションを使用する (Go バージョン 1.7 より前)

Go 1.7 より前では、reflect パッケージは、リフレクションを使用してエクスポートされていないフィールドにアクセスし、変更する方法を提供していました。次のコードは、リフレクトを使用してプライベート フィールドを変更する方法を示しています。

func read_foo(f *Foo) {
    v := reflect.ValueOf(*f)
    y := v.FieldByName("y")
    fmt.Println(y.Interface())
}
ログイン後にコピー

ただし、リフレクションを使用してエクスポートされていないフィールドを変更すると、Go バージョン 1.7 以降でパニックが発生します。

方法 2 : ポインター操作 (Go バージョン 1.7 以降)

Go 1.7 以降では、reflect パッケージが更新され、他のパッケージからエクスポートされていないフィールドを変更できないようになりました。ただし、unsafe パッケージを使用したポインター操作を伴う危険なアプローチがあります:

func change_foo(f *Foo) {
    ptrTof := unsafe.Pointer(f)
    ptrTof = unsafe.Pointer(uintptr(ptrTof) + uintptr(8))
    ptrToy := (**Foo)(ptrTof)
    *ptrToy = nil
}
ログイン後にコピー

注意: この目的で unsafe を使用することは強くお勧めできません。これは移植性がなく、データ構造の変更によって壊れる可能性があり、ガベージ コレクションに干渉する可能性があります。

ホワイト ボックス テスト

ホワイト ボックス テストの場合、パッケージ内のプライベート フィールドにアクセスする必要がある場合は、_test.go 命名規則を使用できます。末尾に _test.go が付いているファイルは、テストの実行時にのみコンパイルされます。これにより、実稼働コードではプライベート フィールドをプライベートに保ちながら、ホワイト ボックス テストではプライベート フィールドにアクセスできます。

// mypackage/foo_test.go
package mypackage

import (
    "testing"
)

func TestFoo(t *testing.T) {
    f := new(Foo)
    // Access and modify private fields within Foo
}
ログイン後にコピー

結論

別のパッケージからプライベート フィールドにアクセスするには、正当な理由がある場合にのみ慎重に行われます。リフレクションや安全でないポインター操作などの方法は回避策となる可能性がありますが、重大なリスクと欠点が伴います。ホワイトボックス テストの場合、_test.go 命名規則は、パッケージ内のプライベート フィールドにアクセスするためのより安全で便利なアプローチを提供します。

以上がテストやその他の正当な目的で Go のプライベート フィールドにアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート