Maison  >  Article  >  développement back-end  >  Pourquoi ne puis-je pas modifier la valeur d'un type simple à l'aide d'un récepteur pointeur dans Go ?

Pourquoi ne puis-je pas modifier la valeur d'un type simple à l'aide d'un récepteur pointeur dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-16 06:53:03233parcourir

Why Can't I Modify a Simple Type's Value Using a Pointer Receiver in Go?

Comment modifier la valeur d'un type simple via un récepteur de pointeur en Go ?

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.

Problème

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 , indiquant un pointeur nul.

Comprendre le comportement

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.

Solutions

Pour résoudre ce problème, il existe plusieurs options :

  1. Renvoyer le pointeur modifié :

    • Modifier la fonction pour renvoyer le pointeur modifié et l'attribuer au pointeur d'origine.
    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
    }
  2. Passer un pointeur à modifier :

    • Passez un pointeur non nul du type souhaité à la fonction et modifiez sa valeur.
    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
    }
  3. Assurer le récepteur non nul :

    • Initialisez le récepteur à une valeur non nulle avant d'appeler la méthode, de sorte que le pointé la valeur peut être modifiée.
    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!

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