代码之家  ›  专栏  ›  技术社区  ›  learningtech

v、 传入反思。新的(类型)

  •  2
  • learningtech  · 技术社区  · 7 年前

    我的问题与此相关:

    golang - Elem Vs Indirect in the reflect package

    基本上,它声称下面的表达式是正确的,如果 someX reflect.Value 包含指针的

    reflect.Indirect(reflect.ValueOf(someX)) === reflect.ValueOf(someX).Elem()
    

    如果是这样的话,那么为什么我下面的代码会在最后一行崩溃呢?

    package main
    
    import (
      "reflect"
      "log"
    )
    
    type Person struct {
      Name string
    
    }
    
    func main() {
    
    
    newitem := reflect.New(reflect.ValueOf(Person{}).Type())
    
    log.Println(reflect.TypeOf(newitem)) // shows reflect.Value
    log.Println(newitem.Type().Kind()) // shows it is a ptr
    
    log.Println(reflect.Indirect(reflect.ValueOf(newitem))) // this line does not cause panic
    log.Println(reflect.ValueOf(newitem).Elem()) // this line causes panic
    
    }
    

    1 回复  |  直到 7 年前
        1
  •  5
  •   Cerise Limón    7 年前

    我们来分解一下:

    log.Println(reflect.ValueOf(newitem).Elem())
    

    价值 newItem reflect.ValueOf(newItem) reflect.Value 包含 . 因为包含的值不是指针或接口,所以 Elem() 恐慌。

     log.Println(reflect.Indirect(reflect.ValueOf(newitem))) 
    

    log.Println(reflect.Indirect(newitem))
    log.Println(newitem.Elem())
    

    Run it on the Playground!