> 백엔드 개발 > Golang > 포인터 참조를 처리할 때 Go에서 인터페이스 값의 실제 복사본을 만드는 방법은 무엇입니까?

포인터 참조를 처리할 때 Go에서 인터페이스 값의 실제 복사본을 만드는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-07 09:40:15
원래의
668명이 탐색했습니다.

How to Create True Copies of Interface Values in Go When Dealing with Pointer References?

인터페이스 값의 복사와 참조

Go에서는 고유한 상태를 유지하기 위해 인터페이스 값의 복사본을 생성해야 하는 시나리오가 발생할 수 있습니다. 포인터 참조를 보유하는 인터페이스 값을 복사할 때 의미를 고려하는 것이 중요합니다. 이 문서에서는 이러한 시나리오를 처리하는 방법을 살펴보고 실제 복사본을 만드는 기술을 제공합니다.

문제: 포인터 참조를 통해 값 공유

주어진 예에서 user1은 포인터를 통해 Admin 구조체를 참조합니다. 이는 user1을 user2에 할당하면 본질적으로 user2가 동일한 기본 관리 구조체를 가리키도록 한다는 의미입니다. user1 또는 user2를 통해 수정된 내용은 원래 구조체에 영향을 미칩니다.

해결책 1: 기본 구조체를 명시적으로 복사

고유한 복사본을 만드는 한 가지 방법은 user1에 값을 입력하고 copy를 입력하는 것입니다. 기본 Admin 구조체를 만들고 해당 주소를 새 User 값으로 래핑합니다.

var user2 User
padmin := user1.(*Admin) // Obtain *Admin pointer
admin2 := *padmin        // Make a copy of the Admin struct
user2 = &admin2          // Wrap its address in another User
로그인 후 복사

해결책 2: 리플렉션 사용

보다 일반적인 솔루션의 경우 Go의 리플렉션 기능을 활용하여 기본 유형을 검색하고 해당 유형의 새 값을 동적으로 생성한 다음 새 User 값으로 래핑할 수 있습니다.

if reflect.TypeOf(user1).Kind() == reflect.Ptr {
    // Pointer:
    user3 = reflect.New(reflect.ValueOf(user1).Elem().Type()).Interface().(User)
} else {
    // Not pointer:
    user3 = reflect.New(reflect.TypeOf(user1)).Elem().Interface().(User)
}
로그인 후 복사

리플렉션을 사용하면 user1의 값이 a가 아닌 경우를 처리할 수 있습니다. 포인터.

결론

인터페이스 값을 복사하고 고유하게 유지해야 하는 경우 기본 유형을 신중하게 고려하고 명시적 복사 또는 리플렉션과 같은 적절한 기술을 사용하여 실제 복사본을 만드는 것이 중요합니다. . 이러한 접근 방식을 사용하면 원본에 영향을 주지 않고 하나의 복사본을 수정할 수 있습니다.

위 내용은 포인터 참조를 처리할 때 Go에서 인터페이스 값의 실제 복사본을 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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