Maison > développement back-end > Golang > 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
Libérer: 2024-11-16 06:53:03
original
325 Les gens l'ont consulté

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>
}
Copier après la connexion

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
    }
    Copier après la connexion
  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
    }
    Copier après la connexion
  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
    }
    Copier après la connexion

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!

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