Golang指针的困惑,如何从函数中获取指针,并将其传递给修改函数

kx5bkwkv  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(105)

我想使用library(golang walk declarative),它期望我传递一个指针变量,然后library将用一个示例填充它。
为了便于记录,我试图创建一个函数,它将返回引用并进一步传递它,但在原始函数中,我没有返回对正确对象的引用。
我试图简化这个问题,但我仍然无法得到正确的答案,我如何在不修改setup函数的情况下,在test_ref结构中将value world填充到map中。
工作代码

var t *walk.LineEdit
...
                    LineEdit{
                        AssignTo: &t,
                    },

我的尝试

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

}

如果我对setup函数做一个小的修改,我可以让它工作,但是因为我不想更新walk库,我想知道是否有一种方法可以在不接触setup函数的情况下完成它。

func setup(t test_setup) {
    w := "world"
    **(t.s) = w
}
hkmswyz6

hkmswyz61#

这里:

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的地址,这是存储在Map中的内容。然后又道:

type test_setup struct {
    s *string
}

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

这将把字符串的值设置为“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

}

相关问题