パッケージ間のプライベート フィールドへのアクセス
あるパッケージ (foo など) で定義された構造体にプライベート フィールドと別のパッケージが含まれるシナリオを考えてみましょう。 (バーなど) にはアクセスする必要があります。残念ながら、Go のパッケージレベルのカプセル化により、外部パッケージからプライベート フィールドに直接アクセスすることは禁止されています。
ただし、これらのプライベート フィールドにアクセスする方法は限られていますが、次のような注意事項があります。
リフレクション (Go
Go 前1.7 では、リフレクションを使用してプライベート フィールドを読み取ることができました。
package bar import "../foo" import "fmt" import "reflect" func read_foo(f *foo.Foo) { v := reflect.ValueOf(*f) y := v.FieldByName("y") fmt.Println(y.Interface()) }
このアプローチでは、プライベート フィールド値の取得は可能ですが、変更はできません。
メモリの操作 (Go > = 1.7)
Go バージョン 1.7 以降では、あまり望ましくない方法として、安全でないポインタを使用してメモリを直接操作する。フィールド サイズとオフセットに基づいてメモリ ポインタを進めることにより、プライベート フィールドにアクセスできます:
package bar import "../foo" import "unsafe" func change_foo(f *foo.Foo) { ptrTof := unsafe.Pointer(f) ptrTof = unsafe.Pointer(uintptr(ptrTof) + uintptr(8)) // Advance by the size of int ptrToy := (**foo.Foo)(ptrTof) *ptrToy = nil }
この方法は、移植性がなく、データ破損の可能性があるため、非常に推奨されません。
代替ソリューション
プライベート フィールドに直接アクセスする代わりに、より適切な解決策があります。オプション:
カプセル化の目的は、データの整合性を維持し、意図しない変更を防ぐことであることに注意してください。プライベート フィールドにアクセスする必要がある場合は、より適切な代替手段があるかどうかを慎重に検討してください。
以上が異なるパッケージ間で Go のプライベート フィールドにアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。