普通网友 2017-03-28 14:35
浏览 36
已采纳

反射。新返回<nil>而不是初始化的结构

I am using reflection for a library I'm building but there's something I don't understand about reflect.New.

type A struct {
    A int
    B string
}

func main() {

    real := new(A)
    reflected := reflect.New(reflect.TypeOf(real)).Elem().Interface()
    fmt.Println(real)
    fmt.Println(reflected)
}

Gives:

$ go run *go
&{0 }
<nil>

Isn't reflect.New supposed to return &{0 } too? (Runnable Version)

Ultimately, I wish to be able to iterate over the fields of the reflected struct (reflected.NumField() gives reflected.NumField undefined (type interface {} is interface with no methods)) and use SetInt, SetString and so on.

Thanks,

  • 写回答

1条回答 默认 最新

  • douangoo48863 2017-03-28 14:37
    关注

    You used the builtin new() function when you created your real variable, which returns a pointer! Type of real is *A, not A! This is the source of the confusion.

    reflect.New() returns a pointer to the (zeroed) value of the given type (wrapped in a reflect.Value). If you pass the type A, you get back a wrapped *A, A initialized / zeroed. If you pass the type *A, you get back a wrapped **A, *A initialized (zeroed), and the zero value for any pointer type is nil.

    You basically ask reflect.New() to create a new value of a pointer type (*A), and –as mentioned– its zero value is nil.

    You have to pass the type A (and not the type *A). It works like this (try it on the Go Playground):

    real := new(A)
    reflected := reflect.New(reflect.TypeOf(real).Elem()).Elem().Interface()
    fmt.Println(real)
    fmt.Println(reflected)
    

    Or like this (Go Playground):

    real := A{}
    reflected := reflect.New(reflect.TypeOf(real)).Elem().Interface()
    fmt.Println(real)
    fmt.Println(reflected)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端
  • ¥15 基于PLC的三轴机械手程序
  • ¥15 多址通信方式的抗噪声性能和系统容量对比
  • ¥15 winform的chart曲线生成时有凸起
  • ¥15 msix packaging tool打包问题
  • ¥15 finalshell节点的搭建代码和那个端口代码教程
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作