Go에서 슬라이스 복사하는 방법
Wenhao Wang
Dev Intern · Leapcell

Key Takeaways
- 내장된
copy
함수를 사용하여 효율적인 슬라이스 복제를 수행합니다. append
를 사용하여 새로운 슬라이스 복사본을 만들 수도 있습니다.- 참조 유형을 다룰 때는 얕은 복사와 깊은 복사를 유념해야 합니다.
Go에서 슬라이스는 기본 배열에 대한 참조이므로 복사하는 것은 미묘한 작업입니다. 다음은 Go에서 슬라이스를 효과적으로 복사하는 방법입니다.
copy
함수 사용
Go는 슬라이스를 복제하는 내장 copy
함수를 제공합니다. 이 함수는 소스 슬라이스의 요소를 대상 슬라이스로 복사합니다. 사용 방법은 다음과 같습니다.
package main import "fmt" func main() { // 원본 슬라이스 original := []int{1, 2, 3, 4, 5} // 원본과 동일한 길이의 새 슬라이스 생성 copySlice := make([]int, len(original)) // 원본 슬라이스의 요소를 새 슬라이스로 복사 copy(copySlice, original) // 복사된 슬라이스 표시 fmt.Println(copySlice) // 출력: [1 2 3 4 5] }
이 예에서:
- 정수를 포함하는
original
슬라이스를 정의합니다. make
함수를 사용하여original
과 동일한 길이의copySlice
를 만듭니다.copy
함수는original
의 요소를copySlice
로 복제합니다.
슬라이스의 일부 복사
원하는 범위를 지정하여 슬라이스의 하위 집합을 복사할 수도 있습니다.
package main import "fmt" func main() { // 원본 슬라이스 original := []int{1, 2, 3, 4, 5} // 원본의 일부를 담을 새 슬라이스 생성 copySlice := make([]int, 3) // 원본 슬라이스의 하위 집합 복사 copy(copySlice, original[1:4]) // 복사된 슬라이스 표시 fmt.Println(copySlice) // 출력: [2 3 4] }
여기서는 original
슬라이스의 인덱스 1부터 3까지 (인덱스 4 제외)의 요소를 copySlice
로 복사합니다.
Append를 사용하여 슬라이스 복사
또는 append
함수를 사용하여 슬라이스 복사본을 만들 수 있습니다.
package main import "fmt" func main() { // 원본 슬라이스 original := []int{1, 2, 3, 4, 5} // append를 사용하여 복사 copySlice := append([]int{}, original...) // 복사된 슬라이스 표시 fmt.Println(copySlice) // 출력: [1 2 3 4 5] }
이 접근 방식에서:
- 빈 슬라이스
[]int{}
를 초기화합니다. - 가변 인수
original...
와 함께append
를 사용하여original
의 모든 요소를 새 슬라이스에 추가합니다.
중요한 고려 사항
-
깊은 복사 대 얕은 복사: 위의 방법은 얕은 복사를 수행합니다. 즉, 슬라이스 구조는 복제하지만 슬라이스에 참조(예: 포인터, 다른 슬라이스)가 포함된 경우 기본 데이터는 복제하지 않습니다. 깊은 복사를 위해서는 참조된 각 요소를 수동으로 복사해야 합니다.
-
새 슬라이스의 용량:
make
를 사용하여 대상 슬라이스를 만들 때 용량을 지정할 수도 있습니다. 용량이 길이보다 크면 새 슬라이스는 재할당 없이 추가 요소를 수용할 수 있습니다.
이러한 방법을 이해함으로써 Go 프로그램에서 슬라이스 복사를 효과적으로 관리할 수 있습니다.
FAQs
대상 슬라이스가 담을 수 있는 요소만큼만 복사됩니다.
append
는 자체 지원 배열이 있는 새 슬라이스를 만드는 반면, copy
는 미리 할당된 슬라이스가 필요합니다.
아니요, 요소만 복사됩니다. 새 슬라이스를 수정해도 원본 슬라이스에는 영향을 미치지 않습니다.
Go 프로젝트 호스팅을 위한 최고의 선택, Leapcell입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하세요.
무제한 프로젝트를 무료로 배포
- 사용량에 대해서만 비용을 지불하고 요청이나 요금은 없습니다.
타의 추종을 불허하는 비용 효율성
- 유휴 요금 없이 사용한 만큼만 지불합니다.
- 예: $25로 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅.
손쉬운 확장성 및 고성능
- 고도의 동시성을 쉽게 처리할 수 있는 자동 확장.
- 운영 오버헤드가 없으므로 구축에만 집중하세요.
설명서에서 자세히 알아보세요!
X에서 팔로우하세요: @LeapcellHQ