v.Elem () Vs Indirect (v) при передаче в результате отражения. New (Type) - PullRequest
0 голосов
/ 02 сентября 2018

Мой вопрос связан с этим вопросом здесь:

golang - Elem Vs Indirect в отражающей упаковке

В основном он утверждает, что приведенное ниже выражение является истинным, если 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

}

Мне было трудно понять пакет отражения в Go, и, вероятно, я неправильно понял некоторые фундаментальные аспекты языка Go, обозначенные в вопросах переполнения стека, которые я задавал на прошлой неделе.

1 Ответ

0 голосов
/ 02 сентября 2018

Давайте разберем следующую строку:

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

Значение newItem является отражением. Значение. Выражение reflect.ValueOf(newItem) возвращает reflect.Value, содержащее reflect.Value. Поскольку содержащееся значение не является указателем или интерфейсом, вызов Elem() вызывает панику.

Следующая строка не вызывает панику, потому что refle.Indirect возвращает свой аргумент, если аргумент не является указателем.

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

Проблема заключается в том, что приложение оборачивает отражает. Значения отражают. Значения. Используйте прямое отражение. Как показано в следующем коде:

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

Запустите его на детской площадке!

...