슬라이스 전달 및 Append의 이해 (Golang에서)
Daniel Hayes
Full-Stack Engineer · Leapcell

Go에서 슬라이스는 배열에 대한 동적 인터페이스를 제공하는 강력하고 유연한 데이터 구조입니다. 슬라이스를 함수에 전달하고 append
함수를 효과적으로 사용하는 방법을 이해하는 것은 효율적인 Go 프로그래밍에 매우 중요합니다.
Key Takeaways
- 슬라이스를 함수에 전달하면 슬라이스 헤더가 복사되지만 둘 다 동일한 기본 배열을 가리킵니다.
append
가 새로운 할당을 트리거하지 않는 한 함수 내에서 슬라이스를 수정하면 원본에 영향을 줍니다.- 기존 용량을 초과하면
append
함수가 새 배열을 할당할 수 있습니다.
함수에 슬라이스 전달
Go에서 슬라이스를 함수에 전달할 때 기본 배열이 아닌 슬라이스 헤더의 복사본을 전달하는 것입니다. 즉, 함수는 슬라이스 헤더 자체의 복사본(기본 배열, 길이 및 용량에 대한 포인터 포함)을 받지만 원본과 함수의 복사본 모두 동일한 기본 배열을 가리킵니다. 결과적으로 함수 내에서 슬라이스 요소를 수정하면 원본 슬라이스에 영향을 줍니다.
그러나 새 요소를 추가하는 등 함수 내에서 슬라이스 자체를 수정하는 경우 기존 배열의 용량이 충분하지 않으면 함수의 슬라이스 헤더 복사본이 새 기본 배열을 가리킬 수 있습니다. 이 경우 원본 슬라이스는 변경되지 않습니다. 원본 슬라이스에서 이러한 수정 사항을 반영하려면 함수에서 수정된 슬라이스를 반환하고 다시 할당하거나 슬라이스에 대한 포인터를 전달할 수 있습니다.
예제: 함수 내에서 슬라이스 수정
package main import "fmt" func modifySlice(s []int) { s[0] = 10 // 첫 번째 요소를 수정합니다. 원본 슬라이스에 영향을 줍니다. s = append(s, 20) // 새 요소를 추가합니다. 용량을 초과하면 원본 슬라이스에 영향을 주지 않을 수 있습니다. fmt.Println("함수 내부:", s) } func main() { nums := []int{1, 2, 3} modifySlice(nums) fmt.Println("함수 외부:", nums) }
출력:
함수 내부: [10 2 3 20]
함수 외부: [10 2 3]
이 예제에서 s[0]
의 수정은 원본 슬라이스 nums
에 영향을 줍니다. 그러나 append
작업으로 인해 원래 배열의 용량이 초과되면 s
가 새로운 기본 배열을 가리키게 되어 함수 외부에서 nums
가 변경되지 않을 수 있습니다.
append
함수 사용
Go에 내장된 append
함수는 슬라이스 끝에 요소를 추가하는 데 사용됩니다. 슬라이스에 충분한 용량이 있으면 요소가 기존 배열에 추가됩니다. 그렇지 않으면 새 배열이 할당되고 요소가 추가됩니다. append
함수는 업데이트된 슬라이스를 반환하며, 이는 새 기본 배열을 가리킬 수 있습니다.
구문:
newSlice := append(originalSlice, elements...)
예제: 슬라이스에 요소 추가
package main import "fmt" func main() { nums := []int{1, 2, 3} nums = append(nums, 4, 5) fmt.Println(nums) // 출력: [1 2 3 4 5] }
한 슬라이스를 다른 슬라이스에 추가하려면 ...
연산자를 사용하여 두 번째 슬라이스의 요소를 언팩하십시오.
package main import "fmt" func main() { slice1 := []int{1, 2, 3} slice2 := []int{4, 5, 6} slice1 = append(slice1, slice2...) fmt.Println(slice1) // 출력: [1 2 3 4 5 6] }
FAQs
요소를 직접 수정하면 원본에 영향을 주지만 append
는 새 배열을 할당하여 변경 사항을 격리할 수 있습니다.
수정된 슬라이스를 반환하고 다시 할당하거나 슬라이스에 대한 포인터를 전달하십시오.
Go는 새 배열을 할당하고 요소를 복사한 다음 슬라이스 헤더를 업데이트하여 새 배열을 가리키도록 합니다.
이 예제에서 slice2...
는 slice2
의 요소를 언팩하고 append
는 이를 slice1
에 추가합니다.
핵심 내용
-
슬라이스를 함수에 전달하면 슬라이스 헤더가 복사되지만 원본과 복사본 모두 동일한 기본 배열을 가리킵니다.
-
함수 내에서 슬라이스 요소를 수정하면 원본 슬라이스에 영향을 줍니다.
-
함수 내에서 슬라이스에 추가하면 기본 배열의 용량을 초과하면 원본 슬라이스에 영향을 주지 않을 수 있습니다.
append
는 새 배열을 할당할 수 있기 때문입니다. -
함수 내에서 슬라이스에 대한 변경 사항이 원본에 반영되도록 하려면 수정된 슬라이스를 반환하고 다시 할당하거나 슬라이스에 대한 포인터를 전달하십시오.
이러한 동작을 이해하는 것은 Go에서 슬라이스를 효과적으로 조작하는 데 필수적입니다.
저희는 Go 프로젝트 호스팅을 위한 최고의 선택인 Leapcell입니다.
Leapcell은 차세대 서버리스 플랫폼으로 웹 호스팅, 비동기 작업 및 Redis를 제공합니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하십시오.
무제한 프로젝트 무료 배포
- 사용량에 대해서만 비용을 지불합니다. 요청도 수수료도 없습니다.
탁월한 비용 효율성
- 유휴 비용 없이 사용한 만큼 지불합니다.
- 예: 25달러로 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅.
손쉬운 확장성 및 고성능
- 고도의 동시성을 쉽게 처리할 수 있도록 자동 확장.
- 운영 오버헤드가 전혀 없습니다. 빌드에만 집중하십시오.
설명서에서 더 많은 내용을 살펴보십시오!
X에서 저희를 팔로우하세요: @LeapcellHQ