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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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.

1

2

3

4

5

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 :

1

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 :

1

fmt.Printf("%+v", sh)

Copier après la connexion

Le Go Playground produit le sortie suivante :

1

&{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