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)
}
  1. 슬라이스는 배열과 다르게, 크기를 지정하지 않으며 단지 변수들의 타입만 지정합니다.
    내부함수 make를 사용해서 초기값으로 초기화된 일정 크기의 슬라이스를 생성할 수 있습니다.
    예제에서는 3개의 크기를 갖는 슬라이스를 생성했습니다. ("" 문자로 자동 초기화 되었습니다.)
  2. 배열과 동일한 방법으로 값을 가져오거나 설정할 수 있습니다.
  3. 슬라이스 역시 배열과 같이 len()함수를 통해서 크기를 알아낼 수 있습니다.
  4. 배열에서와는 다르게 추가적으로 데이터를 다룰수 있는기능을 제공합니다.(배열은 크기가 고정되면 불변)
    예를들어, append()내장 함수를 사용해서 기존의 슬라이스에 내용을 추가할 수 있습니다.(가변배열)
    이것으로 값이 추가된 새로운 슬라이스를 얻을 수 있게 됩니다.
  5. copy()내장 함수를 사용해서, 슬라이스를 통째로 복사할 수 있습니다.
    예제에는 c라는 빈 슬라이스를 생성한 후 기존의 슬라이스 s를 복사하고 있습니다. (단축선언)
  6. slice[low:high]형식으로, 이름답게 자료를 가공할 수 있습니다.
    예제의 경우 s[2], s[3] s[4]값을 s슬라이스에서 추출한 후 l변수에 대입하고 있습니다.
    배열의 경우는 크기가 이미 고정되어 있기때문에 이와같은 작업을 수행할 수 없습니다!!
  7. 예제의 경우는 s[5]값을 제외한 값을 l변수에 대입하고 있습니다.
  8. 예제의 경우 s[2]부터 끝까지의 내용을 추출하고 있습니다.
  9. 슬라이스를 선언함과 동시에 초기값을 지정해서 생성 할 수 있습니다.
  10. 슬라이스 또한, 배열과 같이 다차원형태로 데이터를 다룰 수 있습니다. 이경우 내부 차원의 크기는
    가변적입니다. 이점이 배열과 다른 점입니다.

실행하면 다음과 같습니다.

$ 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)이라는 내부적인 데이터 구조를 제공하고 있습니다.