golang slice

차유림·2022년 7월 24일
0

배열과 slice 차이점

선언

배열 크기를 지정하면 배열로 정의되고
크기를 지정하지 않으면, 슬라이스이다.

즉, 배열은 크기가 고정되어 있고,
슬라이스는 가변 배열로, 크기를 변경할 수 있다.

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 에서 빠르게 테스트해볼 수 있다.

참고

profile
🎨프론트엔드 개발자💻

0개의 댓글