go언어에서의 슬라이스 [:]

Jane Yeonju Kim·2022년 5월 16일
0

Golang

목록 보기
2/4
post-thumbnail

go 언어에서는 슬라이스의 capacity라는 기능(?)이 있습니다!

C++언어를 개선해서 go 언어를 만들었기 때문에
배열을 연속된 메모리 주소에 담고
그 배열의 시작 주소를 변수에 담아두는 개념은 같습니다.


이미지 출처: developpaper.com

그런데 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)
}
profile
안녕하세요! 김개발자입니다 👩‍💻 🐈

0개의 댓글