>백엔드 개발 >Golang >내보내지 않은 필드가 있는 Go 구조체를 어떻게 복제할 수 있나요?

내보내지 않은 필드가 있는 Go 구조체를 어떻게 복제할 수 있나요?

DDD
DDD원래의
2025-01-03 00:49:36948검색

How Can I Clone a Go Struct with Unexported Fields?

내보내지 않은 필드가 있는 구조를 복제하는 방법?

Go에서 내보내지 않은 필드가 있는 구조는 객체를 복제할 때 문제가 됩니다. 구조체의 필드를 내보내지 않으면 선언 패키지 외부에서 액세스하거나 수정할 수 없습니다.

문제:

다음 T 구조를 고려하세요.

type T struct {
    S  string
    is []int
}

내보내지 않은 필드는 다음과 같기 때문에 하나의 T 개체를 다른 개체에 할당해도 독립 복사본이 생성되지 않습니다. shared.

해결책 1: Clone 메서드

가장 간단한 해결 방법은 T가 정의된 패키지에 Clone 메서드를 제공하는 것입니다. 이 메소드는 내보내지 않은 필드를 포함하여 T의 필드를 명시적으로 복사할 수 있습니다.

해결책 2: Setters

Clone 메소드 제공이 불가능할 경우 setter 제공 SetIs()와 같은 내보내지 않은 필드에 대한 함수를 사용하면 필드.

제한:

이러한 솔루션은 유형에 대한 소스 코드의 가용성에 의존한다는 점에 유의하는 것이 중요합니다. 타사 패키지를 사용하는 경우 원래 패키지를 수정하지 않으면 내보내지 않은 필드가 있는 구조 복제가 불가능할 수 있습니다.

안전하지 않은 접근 방식(권장하지 않음):

그 동안 안전하지 않은 패키지를 사용하면 내보내지 않은 필드에 대한 액세스 제한을 우회할 수 있습니다. 이 접근 방식은 Go의 캡슐화 원칙을 위반하고 런타임 문제로 이어질 수 있으므로 권장되지 않습니다. 오류가 발생했습니다.

대체 옵션:

내보내지 않은 필드를 수정할 필요가 없는 경우 원하는 데이터를 별도의 복제된 구조로 추출하는 것이 좋습니다. 예를 들어, 내보내지 않은 필드는 리플렉션을 사용하여 추출하여 초기 값을 보존할 수 있습니다.

var r T
s := T{S: p.S}

결론:

내보내지 않은 필드가 있는 구조를 복제하려면 신중한 고려가 필요하며 패키지별 솔루션이 포함될 수 있습니다. 사용 가능한 옵션을 평가하는 동안 코드 안전성과 캡슐화에 우선순위를 두는 것이 중요합니다.

위 내용은 내보내지 않은 필드가 있는 Go 구조체를 어떻게 복제할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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