배열 크기를 지정하면 배열로 정의되고
크기를 지정하지 않으면, 슬라이스이다.
즉, 배열은 크기가 고정되어 있고,
슬라이스는 가변 배열로, 크기를 변경할 수 있다.
arr1 := [5]int{1, 2, 3, 4, 5}
slice1 := []int{1, 2, 3, 4, 5}
슬라이스 값 추가는 append
로 할 수 있는데
배열은 크기가 고정되어 있기 때문에 에러가 발생한다.
slice1 := []int{1, 2, 3, 4, 5}
slice1 = append(slice1, 6)
배열은 값자체를 복사하지만,
슬라이스는 참조값으로 복사된다.
슬라이스를 복사한후, 값을 변경하면 복사한 슬라이스 값도 변경된다.
s1 := []int{1,2,3}
s2 := s1
// 메모리 위치 확인
fmt.Println(&s1[0]) // 0xc8200122e0
fmt.Println(&s2[0]) // 0xc8200122e0
// 복사한 슬라이스 값을 변경
s2[1] = 0
// 같은 곳을 잠초하고 있기때문에 원본도 변경
fmt.Println(s1) // [1 0 3]
fmt.Println(s2) // [1 0 3]
fruits := make([]string, 3)
fruits[0] = “apple”
fruits[1] = “banana”
fruits[2] = “tomato”
ftm.Printf(fruits[:2]) // tomato 제외하고 출력
slice[:n]
으로 값을 자를 수 있다.
n개 원소, 즉 n-1
번째 원소까지 자른다.
음수로 자르기 불가하다.
즉, slice[:-1]
대신 fruits[:len(fruits)-1]
을 사용해야 한다.
또한, slice 크기보다 크게 잘라도 패닉이 발생한다.
func main() {
a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
limit := 9
if limit > len(a) {
limit = len(a)
}
fmt.Println(limit) // 9
fmt.Println(a[:limit]) // [1 2 3 4 5 6 7 8 9]
}
go playground 에서 빠르게 테스트해볼 수 있다.