Maison > développement back-end > Golang > Confusion du pointeur Golang, comment obtenir le pointeur de la fonction puis le transmettre à la fonction de modification

Confusion du pointeur Golang, comment obtenir le pointeur de la fonction puis le transmettre à la fonction de modification

WBOY
Libérer: 2024-02-06 10:39:03
avant
606 Les gens l'ont consulté

Golang 指针混淆,如何从函数获取指针,然后传递给修改函数

Contenu de la question

Je souhaite utiliser une bibliothèque (déclarative golang walk) qui s'attend à ce que je passe une variable de pointeur et la bibliothèque la remplira plus tard avec une instance.

À des fins de comptabilité, j'ai essayé de créer une fonction pour renvoyer la référence et la transmettre plus loin, mais dans la fonction d'origine, je n'ai pas récupéré la référence au bon objet.

J'ai essayé de simplifier le problème mais je n'arrive toujours pas à comprendre correctement comment remplir le monde des valeurs dans une carte à l'intérieur de la structure test_ref sans modifier la fonction de configuration.

Code de travail

<code>var t *walk.LineEdit
...
                    LineEdit{
                        AssignTo: &t,
                    },
</code>
Copier après la connexion

Ma tentative

LineEdit{
                        AssignTo: GetLineEdit("msg"),
                    },
...
func GetLineEdit(name string) **walk.LineEdit {
Copier après la connexion

Code de test

type test_ref struct {
    v map[string]*string
}

func (t *test_ref) init() {
    t.v = map[string]*string{}
}

func (t *test_ref) return_ref() **string {
    s := "hello"
    t.v["a"] = &s
    p := t.v["a"]
    return &p
}

type test_setup struct {
    s **string
}

//dont modify this function
func setup(t test_setup) {
    w := "world"
    *(t.s) = &w
}

func main() {
    tr := test_ref{}
    tr.init()
    s := tr.return_ref()
    setup(test_setup{
        s: s,
    })
    fmt.Println(*tr.v["a"])//logging hello

}
Copier après la connexion

Si j'apporte une petite modification à la fonction de configuration, je peux la faire fonctionner, mais comme je ne souhaite pas mettre à jour la bibliothèque ambulante, je me demandais s'il existe un moyen de le faire sans toucher à la fonction de configuration. < /p>

<code>func setup(t test_setup) {
    w := "world"
    **(t.s) = w
}
</code>
Copier après la connexion


Bonne réponse


ici :

func (t *test_ref) return_ref() **string {
    s := "hello"
    t.v["a"] = &s
    p := t.v["a"]
    return &p
}
Copier après la connexion

Ce que vous renvoyez est l'adresse de la variable p.

Je pense que c'est ce que vous essayez de faire :

func (t *test_ref) return_ref() *string {
    s := "hello"
    t.v["a"] = &s
    return &s
}
Copier après la connexion

Ce qui précède renverra l'adresse de s, qui est celle stockée sur la carte. Puis :

Chapitre 823

Cela définira la valeur de la chaîne sur "world".

Vous pouvez poursuivre vos études et faire ce qui suit :

type test_ref struct {
    v map[string]**string
}

func (t *test_ref) init() {
    t.v = map[string]**string{}
}

func (t *test_ref) return_ref() **string {
    s := "hello"
    k := &s
    t.v["a"] = &k
    return &k
}

type test_setup struct {
    s **string
}

// dont modify this function
func setup(t test_setup) {
    w := "world"
    *(t.s) = &w
}

func main() {
    tr := test_ref{}
    tr.init()
    s := tr.return_ref()
    setup(test_setup{
        s: s,
    })
    fmt.Println(**tr.v["a"]) //logging hello

}
Copier après la connexion

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:stackoverflow.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal