본문 바로가기
Go

Go - 슬라이스 사용법 ( cap, make, slicing, copy )

by 맑은안개 2022. 10. 6.

1. 슬라이스 초기화

var x = []int{1, 2, 3, 4, 5}

| 슬라이스는 [], 배열은 [...]

2. nil 로만 비교 가능

var x2 = []int{1, 2, 3, 4, 5}
fmt.Println(x == x2) 

// invalid operation: x == x2 (slice can only be compared to nil)
var empty []int

fmt.Println(empty)
fmt.Println(empty == nil) // slice는 오직 nil 로만 비교 가능

3. append

    var a []int
    fmt.Println("a length:", len(a))

    a = append(a, 5)
    fmt.Println("a length:", len(a), a)

    a = append(a, 1, 2, 3)
    fmt.Println("a length:", len(a), a)

    a length: 0 []
    a length: 1 [5]
    a length: 4 [5 1 2 3]
  • append는 복사본을 반환한다. 해당 값을 변수에 할당하지 않으면 오류를 발생시킨다.
append(a, 4, 10) // append(a, 4, 10) (value of type []int) is not used 

4. Capacity

    // Capacity
    var str = []string{"a", "b", "c"}
    fmt.Println(str, len(str), cap(str))

    str = append(str, "d")
    fmt.Println(str, len(str), cap(str))

    str = append(str, "e", "f")
    fmt.Println(str, len(str), cap(str))

    [a b c] 3 3
    [a b c d] 4 6
    [a b c d e f] 6 6
  • cap을 사용하여 수용크기(Capacity)를 확인할 수 있다.
  • make를 사용하여 지정된 Capacity를 갖는 슬라이스를 만들 수 있다.

5. make

    var top5_fruits = make([]string, 5)
    fmt.Println(top5_fruits, len(top5_fruits), cap(top5_fruits))

    top5_fruits[0] = "apple"
    top5_fruits[1] = "banana"

    fmt.Println(top5_fruits, len(top5_fruits), cap(top5_fruits))

    [    ] 5 5
    [apple banana   ] 5 5
  • len, cap이 5인 슬라이스를 만든다.
    var rank = make([]int, 5, 10)
    fmt.Println(rank, len(rank), cap(rank))

    [0 0 0 0 0] 5 10
  • length가 5, capacity가 10인 슬라이스를 만들었다.

6. Slicing

    var t = []int{1, 2, 3, 4, 5}
    var t1 = t[:3]
    var t2 = t[:]

    fmt.Println(t)
    fmt.Println(t1)
    fmt.Println(t2)

    t[0] = 10
    fmt.Println(t2)

    [1 2 3 4 5]
    [1 2 3]
    [1 2 3 4 5]
    [10 2 3 4 5]
  • 마지막 t2의 결과처럼 하위 슬라이스는 부모 슬라이스의 메모리를 공유한다.

7. Copy

    source := []string{"apple", "banana", "kiwi"}
    target := make([]string, 3)

    num := copy(target, source)

    fmt.Println(target, num)

    // length 크기에 따라 복사
    target2 := make([]string, 2)

    num = copy(target2, source)

    fmt.Println(target2, num)
  • copy는 독립적인 슬라이스를 생성한다.
  • copy는 두 개의 파라미터를 받는다. 첫 번째는 대상, 두 번째는 원본이다. 본사된 요소의 개수를 반환한다.
반응형