자, 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!