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

패키지 간 이동에서 개인 구조체 필드에 어떻게 액세스할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-12-22 04:26:11223검색

How Can I Access Private Struct Fields in Go Across Packages?

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

Go에서는 데이터 숨기기를 적용하기 위해 프라이빗 구조체 필드를 사용하여 데이터를 캡슐화하는 것이 일반적입니다. 그러나 화이트박스 테스트 목적과 같이 다른 패키지에서 이러한 비공개 필드에 액세스해야 하는 상황이 있을 수 있습니다.

Reflect 기반 접근 방식(Go < 1.7)

리플렉션을 사용하면 Go 1.7 이전 버전에서는 private 구조체 필드를 읽을 수 있습니다. 예는 다음과 같습니다.

import (
    "fmt"
    "reflect"

    "github.com/other-package/foo"
)

func readFoo(f *foo.Foo) {
    v := reflect.ValueOf(*f)
    y := v.FieldByName("y")
    fmt.Println(y.Interface())
}

이 접근 방식을 사용하면 비공개 필드를 읽을 수 있지만 이를 수정하려고 하면 패닉이 발생합니다.

안전하지 않은 기반 접근 방식(Go ≥ 1.7)

Go 1.7 이상에서는 unsafe 패키지를 사용하는 보다 직접적인 접근 방식을 채택할 수 있습니다. 개인 구조체 필드를 읽고 수정합니다. 그러나 이 방법은 낮은 수준의 포인터 조작에 의존하고 쉽게 메모리 손상 및 기타 문제를 일으킬 수 있으므로 권장되지 않습니다. 예는 다음과 같습니다.

import (
    "unsafe"

    "github.com/other-package/foo"
)

func changeFoo(f *foo.Foo) {
    ptrTof := unsafe.Pointer(f)
    ptrTof = unsafe.Pointer(uintptr(ptrTof) + unsafe.Sizeof(foo.Foo{}.x))
    ptrToy := (**foo.Foo)(ptrTof)
    *ptrToy = nil
}

대체 접근 방식

화이트박스 테스트를 촉진하면서 캡슐화를 유지하려면 다음 대안을 고려하세요.

  • 전용 메소드 노출: 메소드 내보내기 비공개 필드에 대한 제어된 액세스를 제공하는 원본 패키지.
  • 포함된 유형 사용: 비공개 필드에 대한 액세스가 필요한 패키지 내에 포함된 유형을 만들고 해당 포함된 유형을 내보냅니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.