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:
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!