Heim >Backend-Entwicklung >Golang >Golang-Zeiger-Verwirrung, wie man den Zeiger von der Funktion erhält und ihn dann an die modifizierende Funktion übergibt

Golang-Zeiger-Verwirrung, wie man den Zeiger von der Funktion erhält und ihn dann an die modifizierende Funktion übergibt

WBOY
WBOYnach vorne
2024-02-06 10:39:03591Durchsuche

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

问题内容

我想使用库(golang walk声明式),它希望我传递一个指针变量,并且库稍后将用一个实例填充它。

出于簿记目的,我尝试创建一个函数来返回引用并进一步传递它,但在原始函数中我没有取回对正确对象的引用。

我试图简化问题,但我仍然无法正确解决问题,如何在不修改设置函数的情况下,在 test_ref 结构内将值世界填充到地图中。

工作代码

<code>var t *walk.LineEdit
...
                    LineEdit{
                        AssignTo: &t,
                    },
</code>

我的尝试

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

测试代码

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

}

如果我对设置函数进行小修改,我可以让它工作,但由于我不想更新步行库,我想知道是否有一种方法可以在不触及设置函数的情况下完成此操作。

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


正确答案


这里:

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

您返回的是变量p的地址。

我认为这就是您正在尝试做的事情:

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

上面将返回s的地址,这是存储在地图中的内容。然后:

第823章

这会将字符串的值设置为“world”。

您可以进一步深造并执行以下操作:

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

}

Das obige ist der detaillierte Inhalt vonGolang-Zeiger-Verwirrung, wie man den Zeiger von der Funktion erhält und ihn dann an die modifizierende Funktion übergibt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen