go 언어에서는 슬라이스의 capacity라는 기능(?)이 있습니다!
C++언어를 개선해서 go 언어를 만들었기 때문에
배열을 연속된 메모리 주소에 담고
그 배열의 시작 주소를 변수에 담아두는 개념은 같습니다.
그런데 go 언어에서는 그 변수의 (보여줄) 길이 length도 같이 담아서 저장합니다.
메모리에 저장된 실제 용량는 capacity라고 불립니다!
그리고 이 값들을 각각 len(), cap() 함수로 접근해서 확인할 수 있습니다!
연습하기: Go를 향한 여행
package main
import "fmt"
func main() {
// int 자료형 배열 생성, 자동으로 갯수를 계산합니다.
s := []int{2, 3, 5, 7, 11, 13}
printSlice(s) // len=6 cap=6 [2 3 5 7 11 13]
// 0번째 인덱스까지 배열을 slice하여
// 보여줄 길이 len은 0이 되고, 실제 용량 cap은 6으로 달라진 게 없습니다!
s = s[:0]
printSlice(s) // len=0 cap=6 []
// 4번째 인덱스까지 다시 배열을 연장하면
// 보여줄 길이 len은 4가 되고, 실제 용량 cap은 그대로 6입니다.
s = s[:4]
printSlice(s) // len=4 cap=6 [2 3 5 7]
fmt.Println(unsafe.Sizeof(s)) // 24
// 그런데! 2번째 인덱스부터 배열을 자르면
// 보여줄 길이 len만 2로 줄어드는 게 아니라, 실제 용량 cap도 4로 줄어듭니다!
s = s[2:]
printSlice(s) // len=2 cap=4 [5 7]
fmt.Println(unsafe.Sizeof(s)) // 24
// 4번째 인덱스까지 slice를 해도(3번째 인덱스까지 유효)
// 실제 용량 자체가 3번째 인덱스까지 있기 때문에 아무런 변화가 없습니다.
s= s[:4]
printSlice(s) // len=4 cap=4 [5 7 11 13]
}
func printSlice(s []int) {
fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}