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 ?

Comment puis-je inspecter l'en-tête d'un Go Slice en toute sécurité et de manière dangereuse ?

Linda Hamilton
Libérer: 2024-12-18 01:16:09
original
522 Les gens l'ont consulté

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

Inspection des en-têtes de tranche

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))
}
Copier après la connexion

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
}
Copier après la connexion

L'opération non sécurisée suivante montre comment convertir un pointeur de tranche en *reflect.SliceHeader :

sh := (*reflect.SliceHeader)(unsafe.Pointer(&newSlice2))
Copier après la connexion

Vous pouvez ensuite imprimer le contenu de l'en-tête en utilisant la chaîne de format %v :

fmt.Printf("%+v", sh)
Copier après la connexion

Le Go Playground produit le sortie suivante :

&{Data:1792106 Len:8 Cap:246}
Copier après la connexion

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 :

  • Utiliser &newSlice2[0] pour Data
  • len(newSlice2) pour Len
  • cap(newSlice2) pour Cap

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal