Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Memeriksa Pengepala Go Slice Dengan Selamat dan Tidak Selamat?

Bagaimanakah Saya Boleh Memeriksa Pengepala Go Slice Dengan Selamat dan Tidak Selamat?

Linda Hamilton
Linda Hamiltonasal
2024-12-18 01:16:09442semak imbas

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

Memeriksa Pengepala Slice

Dalam Go, hirisan ialah rujukan kepada tatasusunan asas dan pengepalanya menyimpan maklumat tentang panjang dan kapasiti kepingan, serta penunjuk ke data asas. Walaupun kandungan hirisan boleh diubah suai, pengepalanya lazimnya kekal sama.

Pertimbangkan coretan kod berikut:

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))
}

Apabila fungsi SubtractOneFromLength dipanggil, ia mengubah suai hirisan tetapi bukan tajuk hirisan. Untuk memeriksa pengepala hirisan, anda boleh menggunakan jenis reflect.SliceHeader.

type SliceHeader struct {
    Data uintptr
    Len  int
    Cap  int
}

Operasi tidak selamat berikut menunjukkan cara menukar penuding hirisan kepada *reflect.SliceHeader:

sh := (*reflect.SliceHeader)(unsafe.Pointer(&newSlice2))

Anda kemudian boleh mencetak kandungan pengepala menggunakan rentetan format % v:

fmt.Printf("%+v", sh)

The Go Playground menghasilkan output berikut:

&{Data:1792106 Len:8 Cap:246}

Output ini memberikan alamat memori data asas (Data), panjang kepingan (Len) , dan kapasitinya (Cap).

Tanpa tidak selamat:


Mengakses maklumat pengepala kepingan tanpa tidak selamat juga mungkin:

  • Gunakan &newSlice2[0] untuk Data
  • len(newSlice2) untuk Len
  • cap(newSlice2) untuk Cap

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memeriksa Pengepala Go Slice Dengan Selamat dan Tidak Selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn