갈루아의 반서재

슬라이스는 배열의 한 부분이다. 배열과 마찬가지로 슬라이스는 인덱스가 가능하며 길이를 가진다. 하지만 배열과는 달리, 그 길이라는 것이 가변적이다. 다음의 예제를 보자. 

1
var x []float64
cs

배열과의 유일한 차이점은 괄호 안의 길이를 나타내는 부분이 비워져 있다는 것이다. 위의 경우에는 x 가 길이 0 으로 생성이 되었다.

내장 make 함수를 이용하여 슬라이스를 생성할 수 있다. 아래는 길이 5의 float64 배열과 관련된 슬라이스를 생성한다. 

1
:= make([]float645)
cs

슬라이스는 배열과 연관이 있으며, 절대 배열의 크기보다 클 수는 없다. make 함수는 3번째 인수도 갖는데, 아래의 예에서 10은 슬라이스가 가리키는 내포된 배열의 용량을 의미한다. 

1
:= make([]float64510)
cs


 

 

 

 

 

 

 

 

 

 

 X

 

 

 

 

 


슬라이스를 만드는 또 다른 방법은 [low : high] 식을 사용하는 것이다.

1
2
arr := [5]float64{1,2,3,4,5}
:= arr[0:5]
cs

low는 슬라이스의 시작점을 나타내는 인덱스이고, high는 그 끝을 나타내는 인덱스이다 (하지만 인덱스 자체는 포함하지 않는다). 예를 들어 arr[0:5] 은 [1,2,3,4,5] 를 반환하는 반면, arr[1:4] 는 [2,3,4] 를 반환한다.

편의상 low 나 high 또는 둘 모두를 생략할 수 있다. arr[0:] 는 arr[0:len(arr)] 와 같으며, arr[:5] 는 arr[0:5] 와, 그리고 arr[:] 는 arr[0:len(arr)] 와 동일하다.


Slice Functions

Go는 슬라이스를 지원하는 2개의 내장 함수 - append 와 copy - 를 가지고 있다. 아래는 append 의 예제이다.

1
2
3
4
5
6
7
8
9
package main
 
import "fmt"
 
func main() {
  slice1 := []int{1,2,3}
  slice2 := append(slice1, 45)
  fmt.Println(slice1, slice2)
}
cs

실행해보면 아래와 같이 slice1 은 [1,2,3] 를 그리고 slice2 는 [1,2,3,4,5] 를 출력함을 알 수 있다. 

1
2
3
~/go/src/golang-book/chapter6# go run main.go
[1 2 3] [1 2 3 4 5]
 
cs

append 는 새로운 슬라이스를 생성하는데, 기존 슬라이스를 첫 번째 인수로, 그리고 이에 덧붙일 것을 2번째 인수로 가져와 결합시킨다. 

아래는 copy 의 예이다. 

1
2
3
4
5
6
7
8
9
10
package main
 
import "fmt"
 
func main() {
  slice1 := []int{1,2,3}
  slice2 := make([]int2)
  copy(slice2, slice1)
  fmt.Println(slice1, slice2)
}
cs

실행해보면 아래와 같이 slice1 은 [1,2,3] 를 그리고 slice2 는 [1,2] 를 가짐을 알 수 있다. 슬라이스1의 내용은 슬라이스2로 복사되지만, 슬라이스2가 오직 2개의 원소만을 가질 수 있기 때문에, 복사된 슬라이스1의 내용 중 앞선 2개의 원소만 출력되는 것이다. 

1
2
3
~/go/src/golang-book/chapter6# go run main.go
[1 2 3] [1 2]
 
cs