go reflect: 如何动态创建一个指向...的指针?
go reflect: how to dynamically create a pointer to a pointer to ...?
我想创建一个 reflect.Value
来表示指向最终值的多级嵌套指针。编译时不知道嵌套级别。如何使用 reflect
创建指向指针的指针?
在尝试创建指向指针的指针时,我已经遇到了“无法寻址的值”障碍。
dave := "It's full of stars!"
stargazer := reflect.ValueOf(&dave)
stargazer = stargazer.Addr() // panic: reflect.Value.Addr of unaddressable value
与stargazer.UnsafeAddr()
等相同。虽然stargazer.Elem().UnsafeAddr()
等有效,但我看不出这对(递归)创建一个新的非零指针指向指针有何帮助...
使用以下代码创建指向 stargazer
中值的指针。
p := reflect.New(stargazer.Type())
p.Elem().Set(stargazer)
// p.Interface() is a pointer to the value stargazer.Interface()
示例:
dave := "It's full of stars!"
stargazer := reflect.ValueOf(dave)
for i := 0; i < 10; i++ {
p := reflect.New(stargazer.Type())
p.Elem().Set(stargazer)
stargazer = p
}
fmt.Printf("%T\n", stargazer.Interface()) // prints **********string
我想创建一个 reflect.Value
来表示指向最终值的多级嵌套指针。编译时不知道嵌套级别。如何使用 reflect
创建指向指针的指针?
在尝试创建指向指针的指针时,我已经遇到了“无法寻址的值”障碍。
dave := "It's full of stars!"
stargazer := reflect.ValueOf(&dave)
stargazer = stargazer.Addr() // panic: reflect.Value.Addr of unaddressable value
与stargazer.UnsafeAddr()
等相同。虽然stargazer.Elem().UnsafeAddr()
等有效,但我看不出这对(递归)创建一个新的非零指针指向指针有何帮助...
使用以下代码创建指向 stargazer
中值的指针。
p := reflect.New(stargazer.Type())
p.Elem().Set(stargazer)
// p.Interface() is a pointer to the value stargazer.Interface()
示例:
dave := "It's full of stars!"
stargazer := reflect.ValueOf(dave)
for i := 0; i < 10; i++ {
p := reflect.New(stargazer.Type())
p.Elem().Set(stargazer)
stargazer = p
}
fmt.Printf("%T\n", stargazer.Interface()) // prints **********string