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
Lepaskan: 2024-12-18 01:16:09
asal
438 orang telah melayarinya

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))
}
Salin selepas log masuk

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
}
Salin selepas log masuk

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

sh := (*reflect.SliceHeader)(unsafe.Pointer(&newSlice2))
Salin selepas log masuk

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

fmt.Printf("%+v", sh)
Salin selepas log masuk

The Go Playground menghasilkan output berikut:

&{Data:1792106 Len:8 Cap:246}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan