En Go, les récepteurs de pointeurs dans les méthodes permettent de modifier la valeur d'origine d'une structure. Cependant, cela ne s'applique pas aux types simples. Cette question examine pourquoi de telles modifications ne fonctionnent pas et présente des solutions.
Considérez ce code :
package main import ( "fmt" "strconv" ) type FooInt int func (fi *FooInt) FromString(i string) { num, _ := strconv.Atoi(i) tmp := FooInt(num) fi = &tmp } func main() { var fi *FooInt fi.FromString("5") fmt.Printf("%v\n", fi) // Prints <nil> }
Ici, vous vous attendez à ce que la fonction FromString pour définir la valeur de fi sur 5. Mais il affiche
Dans Go, les arguments de fonction/méthode, y compris le récepteur, sont des copies des valeurs originales. Par conséquent, les modifications au sein de la fonction n'affectent que la copie.
Même pour les pointeurs, le récepteur est une copie du pointeur d'origine, pas le pointeur lui-même. Ainsi, les modifications apportées à la valeur du récepteur n'affecteront pas le pointeur d'origine.
Pour résoudre ce problème, il existe plusieurs options :
Renvoyer le pointeur modifié :
func (fi *FooInt) FromString(i string) *FooInt { num, _ := strconv.Atoi(i) tmp := FooInt(num) return &tmp } func main() { var fi *FooInt fi = fi.FromString("5") fmt.Printf("%v %v\n", fi, *fi) // Prints 0xc0000b4020 5 }
Passer un pointeur à modifier :
func (fi *FooInt) FromString(i string, p **FooInt) { num, _ := strconv.Atoi(i) tmp := FooInt(num) *p = &tmp } func main() { var fi *FooInt fi.FromString("5", &fi) fmt.Printf("%v %v\n", fi, *fi) // Prints 0xc0000b4020 5 }
Assurer le récepteur non nul :
func (fi *FooInt) FromString(i string) { num, _ := strconv.Atoi(i) *fi = FooInt(num) } func main() { fi := new(FooInt) // Initialize to non-nil fi.FromString("5") fmt.Printf("%v %v\n", fi, *fi) // Prints 0xc0000b4020 5 }
En adoptant l'une de ces solutions, vous pouvez modifier efficacement la valeur des types simples à l'aide de récepteurs de pointeurs.
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!