효율적인 슬라이스 딥 카피
Go에서 슬라이스의 딥 카피를 생성하려면 해당 내용을 별도의 메모리 위치에 복제해야 합니다. 이렇게 하면 한 슬라이스에 대한 수정 사항이 다른 슬라이스에 영향을 주지 않습니다.
전체 복사에 대한 한 가지 접근 방식은 추가 기능을 사용하는 것입니다.
copy := append([]T{}, orig...)
여기서는 원본 슬라이스 원본이 다음에 추가됩니다. 빈 슬라이스, 자체 백업 배열로 새 슬라이스 복사본을 생성합니다.
대체 방법은 내장 복사본을 사용하는 것입니다. 함수:
cpy := make([]T, len(orig)) copy(cpy, orig)
이 접근 방식은 orig의 요소를 새로 생성된 슬라이스 cpy로 직접 복사합니다.
두 솔루션 모두 슬라이스의 값을 효과적으로 복사합니다. 그러나 슬라이스에 포인터 또는 포인터 필드가 있는 구조체가 포함된 경우 이러한 포인터 값은 여전히 원래 슬라이스와 동일한 위치를 참조한다는 점에 유의하는 것이 중요합니다.
두 가지 방법을 벤치마킹하면 비슷한 성능을 얻을 수 있습니다.
BenchmarkCopy 100000 24724 ns/op BenchmarkAppend 100000 24967 ns/op
어셈블리 코드는 추가와 복사 모두 작업의 일부로 메모리 제로 채우기를 수행할 가능성이 있음을 보여줍니다.
궁극적으로 추가 방법과 복사 방법 사이의 선택은 개인의 선호도와 성능 고려 사항에 따라 달라집니다. 그러나 두 접근 방식 모두 효과적으로 슬라이스 전체를 복사하여 별도의 슬라이스 데이터 인스턴스로 작업할 때 데이터 무결성을 보장합니다.
위 내용은 Go Slices: 심층 복사를 위한 추가 및 복사 – 어느 것이 더 효율적인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!