내보내지 않은 필드가 있는 구조를 복제하는 방법?
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!