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
WBOYavant
2024-02-06 10:39:03590parcourir

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>

Ma tentative

LineEdit{
                        AssignTo: GetLineEdit("msg"),
                    },
...
func GetLineEdit(name string) **walk.LineEdit {

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

}

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.

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


Bonne réponse


ici :

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

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
}

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

}

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer