크기 정보를 가지고 있는 배열 포인터이다.
# 길이가 0인 배열로 선언
var slice []int
# [1 2 3]
var slice1 = []int{1,2,3}
# 5번 인덱스에 2 / 10번 인덱스에 3을 할당
# [1 0 0 0 0 2 0 0 0 0 3]
var slice2 = []int{1, 5:2, 10:3}
# 주의: 아래의 두 구분은 다릅니다.
var array = [...]int{1,2,3} # 배열 선언
var slice = []int{1,2,3} # 슬라이스 선언
var slice = make([]int, 3)
# 특정 인덱스에 접근
var slice = make([]int, 3)
slice[1] = 5
# 순회1 (for문)
var slice = []int{1,2,3}
for i:=0; i < len(slice); i++ {
fmt.Println(slice[i])
}
# 순회2 (range문)
var i, v := range slice {
slice[i] = v * 2
}
append()를 이용
var slice = []int{1,2,3}
# 한개 요소 추가
slice2 = append(slice, 4)
# [1 2 3 4]
# 여러개 추가
slice3 = append(slice, 3, 4, 5, 6)
# [1 2 3 3 4 5 6]
# 기존의 슬라이스를 이용해서 여러개 추가
slice4 = append(slice3, slice2...)
# [1 2 3 3 4 5 6 1 2 3 4]
배열의 일부를 집어내는 기능
# 단 endIdx 위치의 요소는 제외. startIdx ~ (endIdx-1) 까지의 범위
array[startIdx:endIdx]
슬라이싱으로 배열 일부를 가리키는 슬라이스 만들기
array := [5]int{1,2,3,4,5}
slice := array[1:3]
그렇다면 len과 cap은 어떻게 될까?
array := [5]int{1,2,3,4,5}
slice1 := array[1:3]
slice2 := array[2:3]
fmt.Printf("slice1 len:%d, cap:%d\n", len(slice1), cap(slice1))
// >> slice1 len:2, cap:4
fmt.Printf("slice2 len:%d, cap:%d\n", len(slice2), cap(slice2))
// >> slice2 len:1, cap:3
len
= endIdx - startIdxcap
= 가리키는 배열의 cap - startIdx두 슬라이스가 서로 같은 배열을 가리켜서 발생하는 문제를 방지
slice1 := []int{1,2,3,4,5}
slice2 := make([]int, len(slice1))
// slice 복제
for idx, value := range slice1 {
slice2[idx] = value
}
slice1[0] = 500
fmt.Println(slice1)
fmt.Println(slice2)
slice1 := []int{1,2,3,4,5}
# 요소를 펼쳐서 하나씩 추가
slice2 := append([]int{}, slice1...)
slice1[0] = 500
fmt.Println(slice1)
fmt.Println(slice2)
slice := []int{1,2,3,4,5}
slice1 := make([]int, 3, 10)
slice2 := make([]int, 10, 10)
copy_cnt1 := copy(slice1, slice)
copy_cnt2 := copy(slice2, slice)
fmt.Println(copy_cnt1, slice1)
// >> 3 [1 2 3]
fmt.Println(copy_cnt2, slice2)
// >> 5 [1 2 3 4 5 0 0 0 0 0]
slice := []int{1,2,3,4,5}
remove_idx := 3
for i:=remove_idx+1;i<len(slice);i++ {
slice[i-1] = slice[i]
}
slice = slice[:len(slice)-1]
fmt.Println(slice)
// >> [1 2 3 5]
slice := []int{1,2,3,4,5}
remove_idx := 3
slice = append(slice[:remove_idx], slice[remove_idx+1])
fmt.Println(slice)
// >> [1 2 3 5]
slice := []int{1,2,3,4,5}
slice1 := append(slice, 0)
idx_to_append := 2
value_to_append := 500
for i:=len(slice) ; i > idx_to_append ; i-- {
slice1[i] = slice1[i-1]
}
slice1[idx_to_append] = value_to_append
fmt.Println(slice1)
slice := []int{1,2,3,4,5}
idx_to_append := 2
value_to_append := 500
slice = append(slice[:idx_to_append], append([]int{value_to_append}, slice[idx_to_append:]...)...)
fmt.Println(slice)
append([]int{value_to_append}, slice[idx_to_append:]...)
로 인해 임시 슬라이스가 생성되어 불필요한 메모리를 차지한다slice := []int{1,2,3,4,5}
slice = append(slice, 0)
idx_to_append := 2
value_to_append := 500
copy(slice[idx_to_append+1:], slice[idx_to_append:])
slice[idx_to_append] = value_to_append
fmt.Println(slice)
Len
, Less
, Swap
메서드만 있으면 어떤 구조체든 정렬 가능slice := []int{6,1,4,7,5,2}
sort.Ints(slice)
fmt.Println(slice)
// >> [1 2 4 5 6 7]