Go에서 슬라이스는 기본 배열에 대한 참조이며 해당 헤더는 슬라이스의 길이와 용량에 대한 정보와 포인터를 저장합니다. 기본 데이터. 슬라이스의 내용을 수정할 수 있지만 헤더는 일반적으로 동일하게 유지됩니다.
다음 코드 조각을 고려하세요.
var buffer [256] byte func SubtractOneFromLength(slice []byte) []byte { slice = slice[0 : len(slice)-1] return slice } func main() { slice := buffer[10:20] fmt.Println("Before: len(slice) =", len(slice)) newSlice := SubtractOneFromLength(slice) fmt.Println("After: len(slice) =", len(slice)) fmt.Println("After: len(newSlice) =", len(newSlice)) newSlice2 := SubtractOneFromLength(newSlice) fmt.Println("After: len(newSlice2) =", len(newSlice2)) }
SubtractOneFromLength 함수가 호출되면 슬라이스를 수정하지만 슬라이스 헤더가 아닙니다. 슬라이스 헤더를 검사하려면 Reflect.SliceHeader 유형을 사용할 수 있습니다.
type SliceHeader struct { Data uintptr Len int Cap int }
다음 안전하지 않은 작업은 슬라이스 포인터를 *reflect.SliceHeader로 변환하는 방법을 보여줍니다.
sh := (*reflect.SliceHeader)(unsafe.Pointer(&newSlice2))
그런 다음 형식 문자열 % v:
fmt.Printf("%+v", sh)
The Go를 사용하여 헤더의 내용을 인쇄할 수 있습니다. Playground는 다음 출력을 생성합니다.
&{Data:1792106 Len:8 Cap:246}
이 출력은 기본 데이터의 메모리 주소(Data), 슬라이스 길이(Len) 및 용량(Cap)을 제공합니다.
Unsafe:
Unsafe 없이 슬라이스 헤더 정보에 액세스하는 것도 가능:
위 내용은 Go 슬라이스의 헤더를 안전하고 안전하지 않게 검사하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!