Go의 딥 카피

Jay Singh 2023년6월20일
Go의 딥 카피

객체의 복제본을 생성하려고 하면 전체 복사가 원본 객체의 모든 필드를 정확하게 복사합니다. 또한 필드로 개체가 있는 경우 해당 항목의 복사본도 만들어집니다.

즉, 참조(개체)를 포함하는 개체에 대해 전체 복사를 수행하면 원본 개체와 복제된 개체가 모두 별도의 개체를 참조하며 복사된 개체의 데이터에 대한 변경 내용이 원래 개체에 반영되지 않습니다.

Go에서 깊은 복사를 수행하는 방법을 더 잘 이해하기 위해 몇 가지 사례를 살펴보겠습니다.

Go에서 struct를 사용하여 딥 카피 수행

이러한 깊은 복사를 수동으로 수행할 수 있습니다. 슬라이스의 경우 다음 코드를 사용하여 전체 복사를 수행합니다.

슬라이스가 동일한 슬라이스에 대한 참조일 뿐만 아니라 완전히 별개의 개체임을 알 수 있습니다.

예:

package main

import (
    "fmt"
)

type Cat struct {
    age     int
    name    string
    friends []string
}

func main() {
    harry := Cat{1, "Harry", []string{"Ron", "Jenny", "Kety"}}
    jay := harry

    jay.friends = make([]string, len(harry.friends))
    copy(jay.friends, harry.friends)

    jay.friends = append(jay.friends, "Sid")

    fmt.Println(harry)
    fmt.Println(jay)
}

산출

{1 Harry [Ron Jenny Kety]}
{1 Harry [Ron Jenny Kety Sid]}