> 백엔드 개발 > Golang > 슬라이스: Go!의 중추

슬라이스: Go!의 중추

Patricia Arquette
풀어 주다: 2024-11-16 14:09:03
원래의
269명이 탐색했습니다.

Slices: The Backbone of Go!

자, Go의 가장 다재다능하고 필수적인 기능 중 하나인 슬라이스에 대해 살펴보겠습니다. 다른 언어에서 온 경우 슬라이스를 배열과 유사하다고 생각할 수 있습니다. 그리고 예, 그들은 몇 가지 유사점을 가지고 있지만 슬라이스는 테이블에 더 많은 강력함, 유연성 및 Go 관련 마법을 제공합니다! ?

슬라이스란 무엇인가요? ?

Go에서 슬라이스는 요소 목록(예: 배열)으로 작업할 수 있는 유형이지만 동적이므로 필요에 따라 늘리거나 줄일 수 있습니다. 배열처럼 고정 길이를 미리 지정할 필요가 없습니다. 내부적으로는 어레이로 지원되지만 훨씬 더 많은 제어권을 얻을 수 있습니다. 이를 어레이의 더 멋지고 유연한 형제라고 생각하십시오.

따라서 Go의 슬라이스는 실제로 기본 배열에 대한 "창"입니다. 이 창을 늘리거나 줄여서 크기를 변경할 수 있으며 이는 케이크 조각을 자르는 것만큼 부드럽습니다. ?

슬라이스 만들기 ?
슬라이스를 만드는 것은 매우 간단합니다.

// Using a literal
numbers := []int{1, 2, 3, 4, 5}

// Using the make function
sliceOfStrings := make([]string, 5) // a slice of 5 strings, each 
로그인 후 복사
로그인 후 복사

빈 문자열로 초기화
make를 사용하면 Go에게 특정 길이의 슬라이스를 생성하지만 Go가 관리하는 배열의 지원을 받도록 지시하는 것입니다. 따라서 메모리 할당 세부 사항에 대해 걱정할 필요가 없습니다. ?

길이와 용량?

슬라이스의 두 가지 중요한 개념은 길이와 용량입니다. 길이는 현재 슬라이스에 있는 요소 수이고, 용량은 크기를 조정하기 전에 보유할 수 있는 총 요소 수입니다.

numbers := []int{1, 2, 3}
fmt.Println(len(numbers)) // 3
fmt.Println(cap(numbers)) // 3 (same as length here)
로그인 후 복사
로그인 후 복사

항목 추가를 시작하면 Go는 용량이 가득 찰 때마다 용량을 두 배로 늘려주기 때문에 한도에 도달할까봐 걱정할 필요가 없습니다.

numbers = append(numbers, 4)
fmt.Println(len(numbers)) // 4
fmt.Println(cap(numbers)) // probably 6 now, depending on Go’s growth 
로그인 후 복사
로그인 후 복사

패턴
Slices에 추가하기: Go에 내장된 마법 ?✨
Go의 추가 기능을 사용하면 슬라이스에 요소를 추가하는 것이 파이만큼 쉽습니다. 한 번에 하나 이상의 요소를 추가할 수 있으며 Go가 모든 크기 조정 및 메모리 관련 작업을 처리합니다.

numbers := []int{1, 2, 3}
numbers = append(numbers, 4, 5, 6) // Adding multiple elements at once
fmt.Println(numbers) // [1 2 3 4 5 6]
로그인 후 복사
로그인 후 복사

이 자동 크기 조정 기능을 사용하면 특히 목록이 얼마나 커질지 모르는 경우 슬라이스를 매우 편리하게 사용할 수 있습니다.

슬라이스 슬라이스 ??

Go에서 슬라이싱을 하면 실제로 정말 재미있습니다. 요소를 복사하지 않고도 기존 슬라이스의 "하위 슬라이스"를 생성할 수 있습니다.

numbers := []int{10, 20, 30, 40, 50}
subSlice := numbers[1:4] // Just takes a "slice" of the original slice
fmt.Println(subSlice) // [20 30 40]
로그인 후 복사
로그인 후 복사

숫자[1:4]에서는 첫 번째 인덱스(1)가 포함되고 마지막 인덱스(4)가 제외됩니다. 위치 1, 2, 3에는 요소가 있지만 4에는 없습니다.

이 하위 슬라이스는 여전히 원본 슬라이스와 동일한 기본 배열을 공유하므로 하나를 변경하면 다른 슬라이스에도 영향을 미칩니다.

subSlice[0] = 25
fmt.Println(numbers) // [10 25 30 40 50]
fmt.Println(subSlice) // [25 30 40]
로그인 후 복사
로그인 후 복사

의도하지 않은 변경을 방지하려면 복사를 사용하여 슬라이스의 독립 버전을 생성할 수 있습니다.

// Using a literal
numbers := []int{1, 2, 3, 4, 5}

// Using the make function
sliceOfStrings := make([]string, 5) // a slice of 5 strings, each 
로그인 후 복사
로그인 후 복사

추가로 용량을 변경하시겠습니까?

현재 용량보다 더 큰 슬라이스가 필요한 경우 추가 기능은 자동으로 백그라운드에서 더 큰 새 배열을 생성하고 모든 것을 복사합니다. 이는 믿을 수 없을 정도로 효율적이며 슬라이스를 멋지게 만드는 데 있어 큰 부분을 차지합니다. 추가가 새 어레이를 생성하면 이전 용량의 두 배를 할당하여 확장할 수 있는 공간을 제공합니다!

슬라이싱과 메모리 효율성?

여기에 약간의 Go 비밀이 있습니다. 슬라이싱은 매우 강력하지만 조심하지 않으면 때때로 메모리 누수로 이어질 수 있습니다. 슬라이스는 동일한 기본 배열을 참조하므로 배열의 작은 부분만 사용하더라도 배열이 메모리에 남아 있을 수 있습니다.

예:

numbers := []int{1, 2, 3}
fmt.Println(len(numbers)) // 3
fmt.Println(cap(numbers)) // 3 (same as length here)
로그인 후 복사
로그인 후 복사

이런 경우 복사를 사용하여 필요한 데이터만 포함하고 나머지 메모리는 확보하는 완전히 독립적인 슬라이스를 만드는 것이 가장 좋습니다.

numbers = append(numbers, 4)
fmt.Println(len(numbers)) // 4
fmt.Println(cap(numbers)) // probably 6 now, depending on Go’s growth 
로그인 후 복사
로그인 후 복사

다차원 조각 ??

두 가지 이상의 차원이 필요합니까? 다차원 조각도 만들 수 있습니다! 이는 그리드나 테이블과 같은 작업에 유용할 수 있습니다. 슬라이스 슬라이스를 선언하세요.

numbers := []int{1, 2, 3}
numbers = append(numbers, 4, 5, 6) // Adding multiple elements at once
fmt.Println(numbers) // [1 2 3 4 5 6]
로그인 후 복사
로그인 후 복사

각 "행"은 그 자체로 하나의 슬라이스이므로 필요한 경우 독립적으로 성장시킬 수 있습니다.

numbers := []int{10, 20, 30, 40, 50}
subSlice := numbers[1:4] // Just takes a "slice" of the original slice
fmt.Println(subSlice) // [20 30 40]
로그인 후 복사
로그인 후 복사

닐 슬라이스?

nil 슬라이스는 아직 초기화되지 않은 슬라이스입니다. 길이와 용량이 0이지만 당황하지 않고 추가와 같은 기능을 사용할 수 있습니다.

subSlice[0] = 25
fmt.Println(numbers) // [10 25 30 40 50]
fmt.Println(subSlice) // [25 30 40]
로그인 후 복사
로그인 후 복사

nil 슬라이스에 추가하면 Go가 자동으로 초기화합니다. 소매를 걷어붙이는 깔끔한 요령입니다.

함정과 모범 사례?
공유 메모리 주의: 슬라이스는 원래 배열과 메모리를 공유한다는 점을 기억하십시오. 이는 성능에는 좋지만 불필요한 데이터를 메모리에 유지하지 않도록 대규모 배열의 일부를 분할할 때는 주의하세요.

크기 조정 주의: 추가할 때 현재 용량이 가득 찬 경우 Go는 새로운 기본 배열을 생성해야 할 수도 있습니다. 이는 작은 크기 조정을 여러 번 수행하는 것보다 더 효율적일 수 있지만 대규모 데이터세트를 처리하는 경우 오버헤드에 유의하세요.

성급한 최적화 방지: Go는 슬라이스를 사용하여 많은 메모리 할당과 크기 조정을 자동으로 처리합니다. 종종 이러한 세부 사항을 세세하게 관리하려고 하면 코드가 더 복잡해지고 효율성이 떨어질 수 있습니다. 대부분의 경우 올바른 작업을 수행하는 Go의 슬라이스 메커니즘을 신뢰하세요.

위 내용은 슬라이스: Go!의 중추의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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