I want to use a library (golang walk declarative) which wants me to pass a pointer variable and the library will use an instance later Fill it.
For bookkeeping purposes I tried creating a function to return the reference and passing it further, but in the original function I did not get back the reference to the correct object.
I tried to simplify the problem but I still can't figure it out correctly, how to populate the value world into a map inside the test_ref structure without modifying the setup function.
Working code
<code>var t *walk.LineEdit ... LineEdit{ AssignTo: &t, }, </code>
My attempt
LineEdit{ AssignTo: GetLineEdit("msg"), }, ... func GetLineEdit(name string) **walk.LineEdit {
Test code
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 }
If I make a small modification to the setup function, I can get it to work, but since I don't want to update the walking library, I was wondering if there is a way to do this without touching the setup function. < /p>
<code>func setup(t test_setup) { w := "world" **(t.s) = w } </code>
Here:
func (t *test_ref) return_ref() **string { s := "hello" t.v["a"] = &s p := t.v["a"] return &p }
What you returned is the address of variable p
.
I think this is what you are trying to do:
func (t *test_ref) return_ref() *string { s := "hello" t.v["a"] = &s return &s }
The above will return the address of s
, which is what is stored in the map. Then:
This will set the value of the string to "world".
You can further your education and do the following:
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 }
The above is the detailed content of Golang pointer confusion, how to get the pointer from the function and then pass it to the modifying function. For more information, please follow other related articles on the PHP Chinese website!