> 백엔드 개발 > Golang > 테스트 및 기타 합법적인 목적을 위해 Go에서 비공개 필드에 어떻게 액세스할 수 있나요?

테스트 및 기타 합법적인 목적을 위해 Go에서 비공개 필드에 어떻게 액세스할 수 있나요?

Linda Hamilton
풀어 주다: 2024-12-19 09:36:10
원래의
1047명이 탐색했습니다.

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 이상)

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿