외부 패키지에서 프라이빗 구조체 필드에 액세스
Go에서 구조체의 프라이빗 필드는 해당 필드가 있는 패키지 외부에서 액세스할 수 없도록 설계되었습니다. 한정된. 그러나 테스트 목적 등을 위해 다른 패키지에서 이러한 비공개 필드에 액세스해야 하는 상황이 있습니다.
Reflection 사용
private에 액세스하는 한 가지 방법 다른 패키지의 필드가 리플렉션을 사용하고 있습니다. 리플렉션에는 런타임에 객체의 내부 구조를 검사하는 작업이 포함됩니다. 다음 코드 조각은 1.7 이전의 Go 버전에서 리플렉션을 사용하여 비공개 필드를 읽는 방법을 보여줍니다.
import ( "fmt" "reflect" ) func read_foo(f *Foo) { v := reflect.ValueOf(*f) y := v.FieldByName("y") fmt.Println(y.Interface()) }
Using Unsafe
In Go 버전 1.7 이상에서 액세스 리플렉션을 사용하는 비공개 필드는 안전하지 않은 것으로 간주됩니다. 또는 안전하지 않은 패키지를 사용하여 액세스 제한을 우회할 수 있습니다. 그러나 이 방법은 이식성이 없고 개체의 구조가 변경되면 예기치 않은 동작이 발생할 수 있으므로 사용하지 않는 것이 좋습니다.
다음 코드 조각은 unsafe를 사용하여 비공개 필드에 액세스하고 수정하는 방법을 보여줍니다.
import "unsafe" func change_foo(f *Foo) { // Advance pointer by field size to reach desired member ptrTof := unsafe.Pointer(f) ptrTof = unsafe.Pointer(uintptr(ptrTof) + uintptr(8)) // 8 is the size of an int on a 64-bit machine ptrToy := (**Foo)(ptrTof) *ptrToy = nil // Nullify y }
대안
일반적으로 다음에서 개인 필드에 액세스하지 않는 것이 좋습니다. 외부 패키지는 캡슐화 원칙을 위반하기 때문입니다. 대신 다음 대안을 고려하십시오.
화이트 박스 테스트 고려 사항
화이트 박스 테스트를 수행하는 경우 소스 코드에 액세스할 수 있으므로 리플렉션 또는 안전하지 않은 사용이 허용될 수 있습니다. 이러한 경우 비공개 필드에 액세스하는 함수를 정의하는 별도의 테스트 패키지를 만들 수 있습니다. 그러나 이러한 테스트는 밀폐적이지 않으며 객체의 구조가 변경되면 예기치 않게 동작할 수 있다는 점에 유의하는 것이 중요합니다.
위 내용은 외부 패키지에서 Go의 개인 구조체 필드에 어떻게 액세스할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!