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 이상)
In Go 1.7 이상에서는 다른 패키지에서 내보내지 않은 필드를 수정할 수 없도록 반영 패키지가 업데이트되었습니다. 그러나 안전하지 않은 패키지를 사용하여 포인터를 조작하는 위험한 접근 방식이 있습니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!