Go에서 슬라이스 기본 배열의 미스터리 공개
Go 프로그래밍 영역에서 슬라이스는 컬렉션을 처리하는 유연한 방법 역할을 합니다. 미리 고정된 길이가 필요 없는 데이터입니다. 연속된 요소 시퀀스에 액세스하기 위한 동적 메커니즘을 제공합니다. 그러나 슬라이스로 작업할 때는 슬라이스가 참조하는 기본 배열을 이해하는 것이 필수적인 경우가 많습니다.
다음 시나리오를 고려해보세요. 길이가 3인 정수 배열이 있습니다.
nums := [3]int{1, 2, 3}
슬라이스 만들기 처음 두 요소를 슬라이싱합니다.
numSlice := nums[:2]
이 경우 numSlice와 nums 모두에 대한 cap은 다음과 같습니다. 3은 기본 배열의 용량을 나타내며 len은 각각 2와 3입니다. 이제 numSlice:
numSlice = append(numSlice, 10)
에 요소를 추가하면 기본 배열 nums가 [1 2 10]으로 변경되어 numSlice가 여전히 원래 배열을 참조함을 나타냅니다. numSlice와 len의 용량은 모두 3으로 유지됩니다.
그러나 두 번째 추가 작업 시:
numSlice = append(numSlice, 20)
용량에 도달했기 때문에 numSlice의 기본 배열이 변경되어야 합니다. 이 새로운 기본 배열은 두 배의 용량과 numSlice의 업데이트된 길이 4에 반영됩니다.
새 배열에 대한 참조 검색
새로 생성된 기본 배열에 액세스하려면 배열을 사용하면 Go에서 Reflect 패키지와 안전하지 않은 패키지의 조합을 활용할 수 있습니다. Reflect.SliceHeader 구조체는 슬라이스의 기본 배열에 대한 포인터를 포함하는 Data라는 필드를 제공합니다.
s := []int{1, 2, 3, 4} hdr := (*reflect.SliceHeader)(unsafe.Pointer(&s)) data := *(*[4]int)(unsafe.Pointer(hdr.Data))
이 기술을 활용하면 기본 배열에 직접 액세스하고 조작하여 더 깊은 정보를 얻을 수 있습니다. Go 프로그램의 데이터 관리를 제어합니다.
위 내용은 Go 슬라이스는 기본 어레이와 어떻게 상호 작용합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!