Maison >développement back-end >Golang >Comment puis-je inspecter l'en-tête d'un Go Slice en toute sécurité et de manière dangereuse ?
Dans Go, les tranches sont des références aux tableaux sous-jacents et leurs en-têtes stockent des informations sur la longueur et la capacité de la tranche, ainsi qu'un pointeur vers les données sous-jacentes. Bien que le contenu d'une tranche puisse être modifié, son en-tête reste généralement le même.
Considérez l'extrait de code suivant :
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)) }
Lorsque la fonction SubtractOneFromLength est appelée, elle modifie la tranche mais pas l'en-tête de tranche. Pour inspecter l'en-tête de tranche, vous pouvez utiliser le type reflex.SliceHeader.
type SliceHeader struct { Data uintptr Len int Cap int }
L'opération non sécurisée suivante montre comment convertir un pointeur de tranche en *reflect.SliceHeader :
sh := (*reflect.SliceHeader)(unsafe.Pointer(&newSlice2))
Vous pouvez ensuite imprimer le contenu de l'en-tête en utilisant la chaîne de format %v :
fmt.Printf("%+v", sh)
Le Go Playground produit le sortie suivante :
&{Data:1792106 Len:8 Cap:246}
Cette sortie fournit l'adresse mémoire des données sous-jacentes (Data), la longueur de la tranche (Len) et sa capacité (Cap).
Sans danger :
Accéder aux informations d'en-tête de tranche sans danger est également possible :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!