Go by Example: [09] Slices
Slices
Go
언어에서는 슬라이스라는 특수항 데이터 타입이 존재합니다. 배열과 유사하지만 좀더 유연하게
데이터를 처리할 수 있습니다.
package main
import "fmt"
fucn main() {
s := make([]string, 3) // [1]
fmt.Println("emp:", s)
s[0] = "a" // [2]
s[1] = "b"
s[2] = "c"
fmt.Println("set:", s)
fmt.Println("get:", s[2])
fmt.Println("len:", len(s)) // [3]
s = append(s, "d") // [4]
s = append(s, "e", "f")
fmt.Println("apd:", s)
c := make([]string, len(s)) // [5]
copy(c, s)
fmt.Println("cpy:", c)
l := s[2:5] // [6]
fmt.Println("sl1:", l)
l = s[:5] // [7]
fmt.Println("sl2:", l)
l = s[2:] // [8]
fmt.Println("sl3:", l)
t := []string{"g", "h", "i"} // [9]
fmt.Println("dcl:", t)
towD := make([][]int, 3) // [10]
for i := 0; i < 3; i++ {
twoD[i] = make([]int, innerLen)
for j := 0; j < innerLen; j++ {
twoD[i][j] = i + j
}
}
fmt.Prinln("2d:", twoD)
}
- 슬라이스는 배열과 다르게, 크기를 지정하지 않으며 단지 변수들의 타입만 지정합니다.
내부함수make
를 사용해서 초기값으로 초기화된 일정 크기의 슬라이스를 생성할 수 있습니다.
예제에서는 3개의 크기를 갖는 슬라이스를 생성했습니다. (“” 문자로 자동 초기화 되었습니다.) - 배열과 동일한 방법으로 값을 가져오거나 설정할 수 있습니다.
- 슬라이스 역시 배열과 같이
len()
함수를 통해서 크기를 알아낼 수 있습니다. - 배열에서와는 다르게 추가적으로 데이터를 다룰수 있는기능을 제공합니다.(배열은 크기가 고정되면 불변)
예를들어,append()
내장 함수를 사용해서 기존의 슬라이스에 내용을 추가할 수 있습니다.(가변배열)
이것으로 값이 추가된 새로운 슬라이스를 얻을 수 있게 됩니다. copy()
내장 함수를 사용해서, 슬라이스를 통째로 복사할 수 있습니다.
예제에는c
라는 빈 슬라이스를 생성한 후 기존의 슬라이스s
를 복사하고 있습니다. (단축선언)slice[low:high]
형식으로, 이름답게 자료를 가공할 수 있습니다.
예제의 경우s[2], s[3] s[4]
값을s
슬라이스에서 추출한 후l
변수에 대입하고 있습니다.
배열의 경우는 크기가 이미 고정되어 있기때문에 이와같은 작업을 수행할 수 없습니다!!- 예제의 경우는
s[5]
값을 제외한 값을l
변수에 대입하고 있습니다. - 예제의 경우
s[2]
부터 끝까지의 내용을 추출하고 있습니다. - 슬라이스를 선언함과 동시에 초기값을 지정해서 생성 할 수 있습니다.
- 슬라이스 또한, 배열과 같이 다차원형태로 데이터를 다룰 수 있습니다. 이경우 내부 차원의 크기는
가변적입니다. 이점이 배열과 다른 점입니다.
실행하면 다음과 같습니다.
$ go run slices.go
emp: [ ]
set: [a b c]
get: c
len: 3
apd: [a b c d e f]
cpy: [a b c d e f]
sl1: [c d e]
sl2: [a b c d e]
sl3: [c d e f]
dcl: [g h i]
2d: [[0] [1 2] [2 3 4]]
배열과 동일하게, fmt.Println()
함수에서 출력함을 알 수 있습니다.
Go Team Slice에서 자세한 정보를 확인하시기바랍니다.
배열(Array)과 슬라이스(Slice) 는 유사한 점도 많다는 것을 알게되었습니다.
Go
언어에서는 여기에 추가적으로, 맵(Map)이라는 내부적인 데이터 구조를 제공하고 있습니다.