GO · 컬렉션
슬라이스 내부 구조
슬라이스는 배열에 대한 (포인터, 길이, 용량) 헤더입니다. 내부 동작을 이해하면 성능과 버그를 예방할 수 있습니다.
컬렉션중급sliceinternalcapacitycopyappend
핵심 설명
슬라이스는 배열에 대한 (포인터, 길이, 용량) 헤더입니다. 내부 동작을 이해하면 성능과 버그를 예방할 수 있습니다.
Go code
package main
import "fmt"
func main() {
// 슬라이스 헤더: (ptr, len, cap)
s := make([]int, 3, 5)
fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
// append: 용량 초과 시 새 배열 할당
s = append(s, 1, 2) // cap 5 이내
fmt.Printf("len=%d cap=%d\n", len(s), cap(s))
s = append(s, 3) // cap 초과 → 새 배열
fmt.Printf("len=%d cap=%d\n", len(s), cap(s))
// 서브슬라이스는 원본과 배열 공유!
a := []int{1, 2, 3, 4, 5}
b := a[1:3] // [2, 3]
b[0] = 99
fmt.Println(a) // [1 99 3 4 5] — 원본도 변경됨!
// 독립 복사
c := make([]int, len(a))
copy(c, a)
c[0] = 0
fmt.Println(a[0], c[0]) // 1 0
}학습 팁
서브슬라이스가 원본과 메모리를 공유하는 것을 방지하려면 copy 또는 append([]T{}, slice...)로 복사하세요.
주의할 점
append가 용량을 초과하면 새 배열을 할당합니다. 기존 서브슬라이스는 여전히 옛 배열을 가리키므로 데이터 불일치가 발생할 수 있습니다.
자주 묻는 질문
슬라이스 내부 구조란 무엇인가요?
슬라이스는 배열에 대한 (포인터, 길이, 용량) 헤더입니다. 내부 동작을 이해하면 성능과 버그를 예방할 수 있습니다.
슬라이스 내부 구조 학습 시 주의할 점은 무엇인가요?
append 가 용량을 초과하면 새 배열을 할당합니다. 기존 서브슬라이스는 여전히 옛 배열을 가리키므로 데이터 불일치가 발생할 수 있습니다.
Continue Learning
Go 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.