>백엔드 개발 >Golang >Go 슬라이스의 헤더를 안전하고 안전하지 않게 검사하려면 어떻게 해야 합니까?

Go 슬라이스의 헤더를 안전하고 안전하지 않게 검사하려면 어떻게 해야 합니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-18 01:16:09445검색

How Can I Inspect the Header of a Go Slice Safely and Unsafely?

슬라이스 헤더 검사

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 없이 슬라이스 헤더 정보에 액세스하는 것도 가능:

  • 데이터에는 &newSlice2[0] 사용
  • Len에는 len(newSlice2)
  • Cap에는 cap(newSlice2)

위 내용은 Go 슬라이스의 헤더를 안전하고 안전하지 않게 검사하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.