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
Linda Hamiltonoriginal
2024-12-18 01:16:09440parcourir

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))
}

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 :

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