티스토리 뷰
Go는 데이터의 시퀀스를 다루기 위해서 배열과 슬라이스 타입을 사용할 수 있다.
- 배열: 길이가 고정된 시퀀스
- 슬라이스: 길이가 가변적인 시퀀스
배열과 슬라이스 비교
배열 | 슬라이스 |
길이가 고정 | 길이가 가변적 |
value type | reference type |
call by value | call by reference |
비교 연산자 사용 가능 | 비교 연산자 사용 불가능 |
슬라이스가 더 유연하고 기능이 많아, 슬라이스를 많이 사용한다.
배열/슬라이스 함수
배열/슬라이스 내장 함수
cap(s) | 배열/슬라이스의 용량 (배열은 길이 == 용량) |
len(s) | 배열/슬라이스 요소 개수 |
슬라이스 내장 함수
append(s, i) | 새로운 요소 추가 |
copy(a, s) | 슬라이스 s의 요소를 슬라이스 a에 복사 (배열에는 불가능) |
슬라이스 연산자
s = s[ : cap(s)] | 슬라이스 길이를 용량만큼 증가 |
배열과 슬라이스 생성
배열의 생성
배열을 생성하는 방식은 다음과 같다.
1. [길이]타입
2. [길이]타입{초기값}
3. [...]타입{초기값}
var a [5]int // 길이가 5인 int형 배열
b := [3]int{1, 2, 3} // 배열 선언과 함께 초기화
c := [3]int{1, 2} // 초기화 되지 않은 공간은 0으로 초기화
d := [...]int{4, 5, 6, 7, 8} // ...: 배열의 길이 지정
e := [3][3]int { // 다차원 배열
{1, 2, 3},
{4, 5, 6}, // 요소의 마지막에는 콤마
}
슬라이스의 생성
슬라이스를 생성하는 방식은 다음과 같다.
1. []타입
2. []타입{ 초깃값 }
3. make([]타입, 길이, capacity)
4. make([타입], 길이)
💡 make 함수로 슬라이스를 생성하면, 제로값으로 초기화된 배열을 메모리 공간에 생성하고 참조를 반환한다.
append 함수로 슬라이스를 확장할 때 슬라이스가 capacity를 초과하면capacity가 증가된 새로운 배열을 생성한다.
요소에 순차적으로 접근
for ... range 루프를 사용하여 인덱스와 값을 얻어올 수 있다.
for index, value := range { }
index는 인덱스이고, value는 값이다.
만약 인덱스를 사용하지 않을 경우에는 _ 를 사용하면 된다.
for _, value := range { }
value는 값이 복사된 것이기 때문에 value를 수정해도 슬라이스나 배열의 값이 변경되지 않는다.
따라서 값을 변경하고 싶을 때는 인덱스를 사용하여 접근을 하여 변경을 해야 한다.
이때 인덱스만 사용하는 경우에는 단순히 변수를 생략해도 된다.
for index := range { }
배열과 슬라이스의 부분 추출
배열과 슬라이스의 일부를 추출하고 싶을 대는 [] 연산자를 사용하면 된다.
[] 안에는 [첫번째 인덱스:마지막인덱스+1]과 같이 작성을 하면 되고, 두 인덱스 모두 생략 가능하다.
s[n:m] | s의 n부터 m-1까지 추출 |
s[n: ] | s의 n부터 마지막까지 추출 |
s[ :m] | s의 처음부터 m-1까지 추출 |
s[ : ] | s의 처음부터 마지막까지 추출 |
슬라이스 변경
append - 슬라이스 추가
append 함수를 사용하여 슬라이스에 요소나 슬라이스를 추가할 수 있다.
append(슬라이스나 요소를 추가할 슬라이스, 추가될 요소나 슬라이스)
append의 파라미터는 다음과 같다.
append를 사용해서 슬라이스에 슬라이스를 추가할 수 있다고 하였다.
위의 이미지를 보면 에러가 발생하는데, 이는 type이 맞지 않아 발생하는 에러이다.
이를 해결하기 위해 두번째 파라미터 slice2 뒤에 ...을 추가하면 된다.
...은 추가되는 것(두번째 파라미터)이 슬라이스라는 것을 알려준다.
만약 capacity가 부족하다면 append는 capacity가 기존의 슬라이스보다 큰 slice를 만들어 반환한다.
배열에 한 개씩 값을 추가하고, 길이와 capacity와 배열의 내용을 출력하는 코드이다.
길이는 1씩 증가하고 capacity는 2배씩 증가하는 것을 확인할 수 있다.
append는 첫 번째나 중간에 요소를 삽입할 수 없고 마지막에만 추가할 수 있다.
slice1의 index의 위치에 slice2를 삽입하는 함수이다.
위의 코드의 동작 과정은 아래와 같다.
1. slice2뒤에 index부터 끝까지 slice1을 append한다.
2. slice1의 index - 1 까지 슬라이싱한 배열 뒤에 1의 결과를 append 한다.
copy 함수를 사용해서 insert 함수를 구현할 수 있다. copy 함수는 복사한 값의 개수를 리턴한다.
position은 삽입될 위치의 첫번째 인덱스 값이다.
sort 패키지의 라이브러리
sort.Float64s | []float64 슬라이스 정렬 | sort.Float64sAreSorted | []float64 슬라이스가 정렬 여부 |
sort.Ints | []int 슬라이스 정렬 | sort.IntsAreSorted | []int 슬라이스 정렬 여부 |
sort.Strings | []string 슬라이스 정렬 | sort.StringsAreSorted | []string 슬라이스 정렬 여부 |
sort.Sort | sort.Interface 타입 슬라이스 정렬 | sort.SortIsSorted | sort.Interface 타입 슬라이스 정렬 여부 |
- Total
- Today
- Yesterday
- 네이버 2022 공채
- Squash and merge
- graphql
- Python
- 1차 인터뷰
- Basic Type
- 코딩테스트
- pm.expect
- python3
- 주생성자
- github
- postman tests
- java
- DGS Framework
- git
- solidity
- squash merge
- 확장 함수
- pm.test
- string
- 코틀린
- downTo
- hashcode
- 2차 인터뷰
- go 특징
- Kotlin
- postman collection
- Kotlin In Action
- postman
- mysql
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |