Go에서 인터페이스 값을 심층 복사하는 방법
Go에서 인터페이스로 작업할 때 인터페이스가 다음을 참조한다는 점을 인식하는 것이 중요합니다. 그들의 기본 가치. 인터페이스 값의 복사본을 수정하면 원래 값에도 실수로 영향을 미칠 수 있습니다. 이 문제는 기본 유형에 대한 포인터를 사용하여 인터페이스 값을 생성할 때 일반적으로 발생합니다.
문제 이해
다음 사용자 인터페이스를 고려하세요.
type User interface { Name() string SetName(name string) }
그리고 Admin 구조체를 사용한 구현:
type Admin struct { name string } func (a *Admin) Name() string { return a.name } func (a *Admin) SetName(name string) { a.name = name }
제공된 예에서 관리 구조체에 대한 포인터는 User 유형의 user1 변수에 할당됩니다. 그러나 user1의 값을 할당하여 user2를 생성하면 두 변수 모두 동일한 기본 관리 구조체를 참조합니다. 결과적으로 user2를 통해 이름을 변경하면 user1을 통해 이름도 변경됩니다.
고유 복사본 생성
인터페이스 값의 고유 복사본을 생성하려면 다음과 같은 몇 가지 옵션이 있습니다.
1. 유형 어설션 및 구조체 복사 사용
이 방법에는 user1의 값을 유형 어설션하고, 기본 구조체의 복사본을 만들고, 복사본의 주소를 새 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 user2.SetName("user2")
2. Reflection 사용
Reflection을 활용하면 인터페이스 값과 동일한 동적 유형의 새 값을 생성하여 전체 복사를 보장할 수 있습니다. 방법은 다음과 같습니다.
var user3 User if reflect.TypeOf(user1).Kind() == reflect.Ptr { user3 = reflect.New(reflect.ValueOf(user1).Elem().Type()).Interface().(User) } else { user3 = reflect.New(reflect.TypeOf(user1)).Elem().Interface().(User) } user3.SetName("user3")
인터페이스 값을 깊이 복사하여 원본에 영향을 주지 않고 수정할 수 있는 고유한 복사본을 만듭니다.
위 내용은 Go에서 인터페이스 값을 Deep Copy하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!