슬라이스가 Go에서 작동하는 방식

Go는 슬라이스를 사용하여 유사한 데이터를 그룹화하는 방법을 제공합니다. 다소 생소한 용어인 것 같아요. 적어도 다른 언어에서 슬라이스라는 용어가 사용되는 것을 본 적이 없습니다. 슬라이스를 잘 사용하는 것도 중요하지만 내부적으로 작동하는 방식을 이해하는 것도 중요합니다. 내부 작동을 이해하는 것이 재미의 절반이라고 생각합니다. 이 게시물에서는 Go에서 슬라이스가 작동하는 방식을 설명합니다.

그러나 먼저 배열을 살펴보겠습니다.



배열로 시작하는 이유는 슬라이스가 배열을 사용하여 구현되기 때문입니다. 배열은 기본적으로 크기가 고정된 컨테이너입니다.

myArray := [3]int{0, 1, 2}


대괄호 안에 배열의 크기를 지정하고, 요소의 데이터 유형을 결정하고, 중괄호 안에 요소를 씁니다. 다음을 수행하여 컴파일러가 배열의 길이를 찾도록 할 수도 있습니다.

myArray := [...]string{"apple", "banana"}


길이를 지정하지 않으면 슬라이스가 대신 생성됩니다. 일단 생성된 어레이의 크기는 변경할 수 없습니다.

이미 배열이 더 원시적이며 Python 목록만큼 기능이 풍부하지 않다는 것을 알 수 있습니다. 저는 Python 배경에서 왔고 버릇없는 초보자 개발자처럼 더 유용한 것을 찾고 싶었습니다. 즉시 나는 더 강력한 것을 찾고있었습니다.

조각의 창조를 보라.



슬라이스는 동적 특성 때문에 배열보다 훨씬 강력합니다. 간단히 말해서 슬라이스는 고무줄과 같습니다. 이동하면서 필요한 만큼 확장됩니다. 고무줄이 단단하고 잘 늘어나지 않는다면 그다지 유용하지 않을 것입니다.

이는 C++ 개발자가 배열과 벡터를 모두 사용할 수 있지만 동적성을 위해 벡터를 사용하는 방법과 유사합니다.

다음은 슬라이스를 초기화할 수 있는 몇 가지 방법입니다.

// method 1: use make() and specify type, length, and capacity.
mySlice := make([]int, 4, 4)
// assign values to each index.
mySlice[0] = 0
mySlice[1] = 1
mySlice[2] = 2
mySlice[3] = 3

// method 2: declare a struct literal.
mySlice := []int{0, 1, 2, 3}

// method 3: create an empty slice and append to it
mySlice := []int{}
mySlice = append(mySlice, 0, 1, 2, 3)


조각은 만든 후에 크기를 변경할 수 있기 때문에 좋습니다. 알 수 없는 양의 데이터를 저장해야 할 때 특히 유용합니다. 슬라이스는 또한 슬라이싱(duh)을 지원하여 주어진 슬라이스의 슬라이스를 가져올 수 있습니다.

mySlice := []int{0, 1, 2, 3}
piece := mySlice[1:3]



[1 2]


따라서 이미 사용성이 크게 개선되었습니다. 하지만 처음 이것을 보았을 때 이것이 어떻게 작동하는지 궁금하지 않을 수 없었습니다.

어떻게 작동합니까? 이 마법은 무엇입니까?



따라서 표면 아래에서 슬라이스는 기본 배열에 대한 포인터를 포함하는 헤더입니다. go의 reflect 패키지를 보면 SliceHeader의 정의를 볼 수 있습니다.

type SliceHeader struct {
    Data uintptr
    Len int
    Cap int
}


따라서 핵심은 어레이이기 때문에 슬라이스는 용량을 초과하여 커질 수 없습니다. 우리가 "슬라이스 확장"이라고 말할 때 우리가 이미 가지고 있는 것에 더 많은 용량을 추가한다는 의미는 아닙니다. 대신 슬라이스가 "성장"하도록 허용하는 것은 바로 이 비하인드 스토리 논리입니다.
  • 현재 길이가 용량과 같은지 확인합니다.
  • 초과 용량을 추가하면 원래 슬라이스 용량의 두 배인 새 슬라이스가 생성됩니다.
  • 원본 슬라이스가 새 슬라이스로 복사됩니다.
  • 새 요소가 끝에 추가됩니다.
  • 결과 조각이 반환됩니다.



  • 슬라이싱도 쉽습니다.
  • 동일한 기본 배열의 새 위치를 가리킵니다.
  • 길이와 용량이 조정됩니다.



  • 이제 우리는 슬라이스가 내부적으로 어떻게 작동하는지 이해합니다. 멋지지 않나요?

    결론



    슬라이스는 배열에 강력한 기능을 제공하는 래퍼로 생각할 수 있습니다. 대부분의 경우 배열 대신 슬라이스를 사용해야 합니다. 그러나 자신이 무엇을 하고 있는지 알고 있다면 배열이 좋은 선택이 될 수 있습니다. 값으로 전달하거나 해시 또는 직렬화해야 하는 것이 필요한 경우 슬라이스보다 배열을 사용해야 합니다. 그러나 대부분의 경우 슬라이스를 고수하는 것이 좋습니다.

    읽어 주셔서 감사합니다! Mediummy personal site에서 이 게시물을 읽을 수 있습니다.

    좋은 웹페이지 즐겨찾기