> 백엔드 개발 > Golang > Go의 슬라이스의 용량과 길이는 얼마입니까?

Go의 슬라이스의 용량과 길이는 얼마입니까?

James Robert Taylor
풀어 주다: 2025-03-19 12:19:32
원래의
231명이 탐색했습니다.

Go의 슬라이스의 용량과 길이는 얼마입니까?

GO에서 슬라이스는 배열 위에 구축 된 유연하고 강력한 데이터 구조입니다. 길이와 용량의 두 가지 주요 속성이 있습니다.

  • 길이 : 슬라이스의 길이는 포함 된 요소의 수입니다. 직접 액세스 할 수있는 슬라이스의 크기를 나타냅니다. len() 함수를 사용하여 슬라이스의 길이를 얻을 수 있습니다.
  • 용량 : 슬라이스의 용량은 새 메모리를 할당하지 않고 슬라이스가 잡을 수있는 최대 요소 수입니다. 기본 배열에 할당 된 총 공간을 나타냅니다. cap() 함수를 사용하여 슬라이스의 용량을 얻을 수 있습니다.

다음은 len()cap() 의 사용을 보여주는 간단한 예입니다.

 <code class="go">package main import "fmt" func main() { s := make([]int, 5, 10) // Creates a slice with length 5 and capacity 10 fmt.Printf("Length: %d, Capacity: %d\n", len(s), cap(s)) }</code>
로그인 후 복사

이 예에서 슬라이스 s 의 길이는 5이고 용량은 10입니다.

GO에서 슬라이스의 용량을 어떻게 수정하려면?

GO에 슬라이스의 용량은 생성되면 불변입니다. 기존 슬라이스의 용량을 직접 수정할 수 없습니다. 그러나 몇 가지 방법을 사용하여 다른 용량의 새 슬라이스를 만들 수 있습니다.

  1. make 기능 사용 : 지정된 길이와 용량으로 새 슬라이스를 만들 수 있습니다.

     <code class="go">newSlice := make([]int, len(oldSlice), newCapacity) copy(newSlice, oldSlice)</code>
    로그인 후 복사
    로그인 후 복사
  2. append Function 사용 : 요소를 슬라이스에 추가하면 GO는 필요한 경우 용량을 자동으로 증가시킵니다.

     <code class="go">s := []int{1, 2, 3} s = append(s, 4, 5, 6) // This might increase the capacity if needed</code>
    로그인 후 복사
  3. copy 기능 사용 : 오래된 슬라이스의 내용을 다른 용량으로 새 슬라이스에 복사 할 수 있습니다.

     <code class="go">newSlice := make([]int, len(oldSlice), newCapacity) copy(newSlice, oldSlice)</code>
    로그인 후 복사
    로그인 후 복사

다음은 다음 방법을 설명하기위한 예입니다.

 <code class="go">package main import "fmt" func main() { s := []int{1, 2, 3} // Length: 3, Capacity: 3 fmt.Printf("Original: Length: %d, Capacity: %d\n", len(s), cap(s)) // Using make and copy newSlice := make([]int, len(s), 10) copy(newSlice, s) fmt.Printf("After make and copy: Length: %d, Capacity: %d\n", len(newSlice), cap(newSlice)) // Using append s = append(s, 4, 5, 6, 7) fmt.Printf("After append: Length: %d, Capacity: %d\n", len(s), cap(s)) }</code>
로그인 후 복사

GO에서 슬라이스 길이를 넘어 인덱스에 액세스하려고하면 어떻게됩니까?

이동 중에 슬라이스 길이를 넘어 인덱스에 액세스하려고하면 런타임 공황이 발생합니다. 슬라이스의 길이는 안전하게 액세스 할 수있는 지수의 범위를 정의하기 때문입니다.

예는 다음과 같습니다.

 <code class="go">package main import "fmt" func main() { s := []int{1, 2, 3} // Length: 3 fmt.Println(s[0]) // This is valid fmt.Println(s[3]) // This will cause a runtime panic }</code>
로그인 후 복사

당신이 볼 수있는 오류 메시지는 다음과 같습니다.

 <code>panic: runtime error: index out of range [3] with length 3</code>
로그인 후 복사

이 공황은 인덱스 3이 슬라이스의 범위를 벗어나 길이의 길이가 3이기 때문에 발생합니다.

GO에서 슬라이스의 길이와 용량의 차이점은 무엇입니까?

Go에서 슬라이스의 길이와 용량은 다른 목적으로 사용되며 다른 역할을합니다.

  • 길이 : 슬라이스의 길이는 현재 보유하고있는 요소의 수입니다. 슬라이스의 유효한 지수를 결정합니다. len(s) - 1 까지 슬라이스의 요소에 액세스 할 수 있으며,이 이상 인덱스에 액세스하려고하면 런타임 공황이 발생합니다.
  • 용량 : 슬라이스의 용량은 기본 배열이 보유 할 수있는 총 요소 수입니다. 새 메모리를 할당하지 않고 슬라이스가 도달 할 수있는 최대 전위 길이를 정의합니다. 메모리 재 할당을 트리거하지 않고 append 함수를 사용하여 슬라이스의 길이를 용량까지 늘릴 수 있습니다.

차이점에 대한 요약은 다음과 같습니다.

  • 길이 :

    • 슬라이스의 현재 요소 수를 정의합니다.
    • len(s) 을 통해 액세스.
    • 유효한 지수의 범위를 결정합니다.
  • 용량 :

    • 기본 배열이 보유 할 수있는 최대 요소 수를 정의합니다.
    • cap(s) 을 통해 액세스.
    • 메모리 재 할당없이 슬라이스의 잠재적 성장을 나타냅니다.

다음은 이러한 개념을 설명하는 예입니다.

 <code class="go">package main import "fmt" func main() { s := make([]int, 3, 5) // Length: 3, Capacity: 5 fmt.Printf("Initial: Length: %d, Capacity: %d\n", len(s), cap(s)) s = append(s, 4) // Length: 4, Capacity: 5 fmt.Printf("After first append: Length: %d, Capacity: %d\n", len(s), cap(s)) s = append(s, 5) // Length: 5, Capacity: 5 fmt.Printf("After second append: Length: %d, Capacity: %d\n", len(s), cap(s)) s = append(s, 6) // Length: 6, Capacity might increase fmt.Printf("After third append: Length: %d, Capacity: %d\n", len(s), cap(s)) }</code>
로그인 후 복사

이 예에서 슬라이스는 길이 3과 용량 5로 시작합니다. 요소를 추가 할 때 길이는 용량에 도달 할 때까지 증가합니다. 원래 용량을 초과하면 용량이 증가 할 수 있습니다.

위 내용은 Go의 슬라이스의 용량과 길이는 얼마입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿