我想設置一個值爲一個零結構像這樣的指針。如何設置一個值包含nil的指針使用反射
// https://play.golang.org/p/jPTMNC_ZQ9
package main
import (
"fmt"
"reflect"
)
type T struct {
A *int
}
func main() {
fmt.Println("Hello, playground")
t := &T{}
v := 1
vptr := &v
CopyValue(vptr, t.A) // I want to set t.A to contain 1
}
func CopyValue(src interface{}, dest interface{}) {
srcRef := reflect.ValueOf(src)
if srcRef.Kind() == reflect.Ptr {
srcRef = srcRef.Elem()
}
destRef := reflect.New(srcRef.Type()).Elem()
destRef.Set(srcRef)
reflect.ValueOf(dest).Elem().Set(destRef)
}
不過,我會遇到以下錯誤:
panic: reflect: call of reflect.Value.Set on zero Value
goroutine 1 [running]:
reflect.flag.mustBeAssignable(0x0, 0x1040a128)
/usr/local/go/src/reflect/value.go:221 +0x260
reflect.Value.Set(0x0, 0x0, 0x0, 0xdefc0, 0x1040a128, 0x182)
/usr/local/go/src/reflect/value.go:1339 +0x40
main.CopyValue(0xd7860, 0x1040a124, 0xd7860, 0x0)
/tmp/sandbox487854080/main.go:30 +0x1a0
main.main()
/tmp/sandbox487854080/main.go:19 +0x100
我在做什麼錯?
另外:傳遞和複製'v'可能更直觀,而不是傳遞'vptr'和複製'* vptr';如果你想複製'* vptr',然後傳遞'* vptr'而不是'vptr'。有關避免運行時恐慌的示例,請參閱https://play.golang.org/p/daDVbMp3em。 –
@ChronoKitsune多麼偉大的例子!我以爲我正在設定T.A指向的值,當時我應該設置地址&T.A指向的地址。 –