> 백엔드 개발 > Golang > 외부 패키지에서 Go의 개인 구조체 필드에 어떻게 액세스할 수 있나요?

외부 패키지에서 Go의 개인 구조체 필드에 어떻게 액세스할 수 있나요?

Linda Hamilton
풀어 주다: 2024-12-21 01:59:09
원래의
556명이 탐색했습니다.

How Can I Access Private Struct Fields in Go from External Packages?

외부 패키지에서 프라이빗 구조체 필드에 액세스

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
}
로그인 후 복사

대안

일반적으로 다음에서 개인 필드에 액세스하지 않는 것이 좋습니다. 외부 패키지는 캡슐화 원칙을 위반하기 때문입니다. 대신 다음 대안을 고려하십시오.

  • 테스트 기능을 비공개 필드와 동일한 패키지로 이동합니다.
  • 인터페이스를 내보내거나 getter/setter 메소드를 제공하여 외부 액세스를 허용합니다. 개인 데이터의 하위 집합입니다.

화이트 박스 테스트 고려 사항

화이트 박스 테스트를 수행하는 경우 소스 코드에 액세스할 수 있으므로 리플렉션 또는 안전하지 않은 사용이 허용될 수 있습니다. 이러한 경우 비공개 필드에 액세스하는 함수를 정의하는 별도의 테스트 패키지를 만들 수 있습니다. 그러나 이러한 테스트는 밀폐적이지 않으며 객체의 구조가 변경되면 예기치 않게 동작할 수 있다는 점에 유의하는 것이 중요합니다.

위 내용은 외부 패키지에서 Go의 개인 구조체 필드에 어떻게 액세스할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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