Définition d'un pointeur Int sur une valeur Int dans Go
Dans Go, une tâche courante consiste à attribuer une valeur à un pointeur int. Cependant, une erreur récemment découverte dans un extrait de code met en lumière un piège potentiel :
package main import ( "fmt" "reflect" ) func main() { var guess *int fmt.Println(reflect.TypeOf(guess)) *guess = 12345 fmt.Println(guess) }
Lors de l'exécution de ce code, l'erreur suivante se produit :
Type: *int panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x483c7d] goroutine 1 [running]: main.main() /home/aaron/projects/gopath/src/github.com/AaronNBrock/go-guess/main.go:16 +0x9d exit status 2
La cause première réside dans le fait que la valeur du pointeur est initialement définie sur zéro. Le déréférencement d'un pointeur nul génère une erreur d'exécution, comme le montre le message d'erreur. La solution réside dans l'allocation de mémoire au pointeur avant de tenter de lui attribuer une valeur :
var guess *int guess = new(int) *guess = 12345
Cette modification garantit que deviner pointe vers un emplacement mémoire valide, nous permettant de définir et de récupérer sa valeur.
Alternativement, l'utilisation d'une courte déclaration de variable peut simplifier le code :
guess := new(int) *guess = 12345
Une autre approche consiste à attribuer l'adresse d'une variable existante au pointeur :
value := 12345 // will be of type int guess := &value
Cette solution pointe vers une variable existante, plutôt que d'allouer une nouvelle mémoire. Changer la valeur pointée modifie également la valeur de la variable d'origine.
Enfin, gardez à l'esprit que pointer un pointeur vers un emplacement et lui attribuer une valeur sont des opérations distinctes. Le premier alloue de la mémoire ou place le pointeur sur une variable existante, tandis que le second modifie la valeur stockée à l'emplacement pointé.
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!