> 백엔드 개발 > Golang > Go에서 인터페이스 값을 Deep Copy하는 방법은 무엇입니까?

Go에서 인터페이스 값을 Deep Copy하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-26 14:56:11
원래의
511명이 탐색했습니다.

How to Deep Copy Interface Values in Go?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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