슬라이스는 다이나믹 배열로, Go에서 배열 작업의 주요 구조 단위입니다. 역사적으로 프로그래밍 언어는 고정 배열이나 더 무거운 구조를 제공했습니다. Go는 자동 크기 관리와 길이 변경 기능으로 메모리 컬렉션에 대한 편리한 도구로 슬라이스를 구현했습니다.
문제는 메모리 관리, 경계 사례 처리(빈, nil, 가득 찬 슬라이스) 및 슬라이스의 길이와 용량 사이의 차이를 이해하는 것입니다.
해결책은 내장 함수 len(), cap()을 올바르게 사용하고 Go의 규칙에 따라 슬라이스를 조작하는 것입니다.
코드 예시:
var a []int // nil 슬라이스, len=0, cap=0 b := make([]int, 0) // 빈 슬라이스, len=0, cap=0 c := make([]int, 3, 5) // len=3, cap=5 c = append(c, 4, 5, 6) // cap가 자동으로 증가함
핵심 특징:
var s []int)는 메모리를 전혀 할당하지 않으며, 빈 슬라이스(make([]int, 0))와는 내부적으로만 다릅니다.nil 슬라이스에 append한 후 슬라이스의 길이와 용량은 얼마입니까?
nil 슬라이스(var s []int)에 대해 append(s, 1)을 수행하면 길이가 1, 용량이 1인 슬라이스가 됩니다. Go가 자동으로 저장소를 할당합니다.
var s []int s = append(s, 42) // s는 이제 [42], len=1, cap=1
nil 슬라이스의 용량에 접근할 수 있습니까?
예, nil 슬라이스의 경우 두 함수 len과 cap 모두 0을 반환합니다. 패닉이 발생하지 않습니다.
var s []int fmt.Println(len(s), cap(s)) // 0 0
nil 슬라이스에 대해 사전 할당 없이 인덱스에 요소를 할당하려고 하면 어떤 일이 발생합니까?
index out of range 패닉이 발생합니다. 슬라이스에 요소가 없기 때문입니다.
var s []int s[0] = 1 // panic: runtime error: index out of range
팀이 Go 서버에서 var s []T를 사용하기로 결정하고 항상 make([]T, 0)과 동일하려고 했습니다. 결과적으로 일부 JSON 직렬화가 null을 반환했습니다.
장점:
단점:
make([]T, 0, 100)을 사용하여 사전 할당한 후, 반복문에서 append만 사용하는 것입니다. 이렇게 하면 메모리 할당이 최소화되고 속도에서 이점을 얻을 수 있습니다.
장점:
단점: