반응형
슬라이스
배열은 정한 길이에서 더이상 크기가 늘어나지 않습니다.
슬라이스를 사용하면 이러한 불편을 해소 할 수 있습니다.
다음 과 같이 선언하면 크기가 0인 슬라이스가 만들어 집니다.
크기를 초과한 접근을 하면 런타임에 패닉이 발생합니다.
var slice []int
// 패닉 발생
slice[1] = 10
사용 방법
// {}로 초기화
var slice = []int{1, 2, 3}
// 다음은 크기가 3인 배열 선언, 구분합시다!
var array = [...]int{1, 2, 3}
// make로 초기화
var slice = make([]int, 3)
// append로 요소 추가
slice = append(slice, 4)
// append로 여러 값 추가
slice = append(slice, 4, 5, 6, 7)
슬라이스는 포인터를 사용한다는 특징이 있습니다. 때문에 메서드의 파라미터로 슬라이스를 사용할 경우 복사를 하여 값을 전달하는 것이 아니라 포인터의 주소를 전달한 다는 것을 유의 해야 겠습니다.
슬라이스가 포인터를 사용한다는 특징을 좀 더 구체적으로 살펴 보겠습니다.
var slice1 = []int{1, 2, 3}
slice2 := append(slice1, 4, 5}
slice1[1] = 20
위 코드를 실행하고 나면 slice2[1]의 값은 무엇을까요?
slice1과 slice2는 동일한 메모리 주소를 가리키고 있기 때문에 slice1[1]과 slice[2]의 값은 모두 20입니다.
그리고, append사용 시 공간이 부족할 경우 2배 크기의 메모리를 확보 후 기존 값을 복사하고 추가되는 값을 채웁니다.
슬라이싱
배열의 일부를 집어내는 기능입니다. 그 결과로 슬라이스를 반환합니다.
array[startIndex:endIndex]
// startIndex : 시작 인덱스
// endIndex : 끝 인덱스
사용 예
array := [5]int{0, 1, 2, 3, 4}
slice := array[1:3] // 1, 2, 3 슬라이스 반환
슬라이스 복제
var slice1 = []int{1, 2, 3}
slice2 := make([]int, len(slice1))
copy(slice2, slice1)
슬라이스 정렬
var slice = []int{5, 4, 1, 3, 2}
sort.Ints(slice)
슬라이스 정렬
var slice = []int{5, 4, 1, 3, 2}
sort.Ints(slice)
'프로그래밍 일반 > Go 프로그래밍' 카테고리의 다른 글
[go] %v와 %+v의 차이 (0) | 2024.11.08 |
---|---|
[go] Context 활용하기 (0) | 2024.11.07 |
Go 언어 Json 태그 자동 추가/삭제 (0) | 2024.04.18 |
Go 언어의 Json Tag (0) | 2024.04.18 |
GoLand 여러개 열기 (0) | 2024.04.17 |