Я пытаюсь сделать принтер отладки общего назначения для сложных типов данных, потому что %v
имеет тенденцию просто печатать значения указателя, а не то, на что они указывают. У меня все работает до тех пор, пока мне не придется иметь дело со структурами, содержащими поля reflect.Value
.
Следующий демонстрационный код работает без ошибок: (https://play.golang.org/p/qvdRKc40R8k)
package main
import (
"fmt"
"reflect"
)
type MyStruct struct {
i int
R reflect.Value
}
func printContents(value interface{}) {
// Omitted: check if value is actually a struct
rv := reflect.ValueOf(value)
for i := 0; i < rv.NumField(); i++ {
fmt.Printf("%v: ", rv.Type().Field(i).Name)
field := rv.Field(i)
switch field.Kind() {
case reflect.Int:
fmt.Printf("%v", field.Int())
case reflect.Struct:
// Omitted: check if field is actually a reflect.Value to an int
fmt.Printf("reflect.Value(%v)", field.Interface().(reflect.Value).Int())
}
fmt.Printf("\n")
}
}
func main() {
printContents(MyStruct{123, reflect.ValueOf(456)})
}
Это печатает:
i: 123
R: reflect.Value(456)
Однако, если я изменю имя поля R
MyStruct на r
, произойдет сбой:
panic: reflect.Value.Interface: cannot return value obtained from unexported field or method
Конечно, это ошибочно, потому что в противном случае это был бы способ перевести неэкспортированное поле в правильную Голанду, а это нет-нет.
Но это оставляет меня в затруднительном положении dry: Как я могу получить доступ ко всем неэкспортированный reflect.Value
относится без использования Interface()
, чтобы я мог просмотреть его содержимое и распечатать? Я просмотрел документацию по отражению и не нашел ничего полезного ...