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

source:php.cn
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