go

golang-reflexión sobre estructuras incrustadas



(1)

Dada una estructura como esta:

type B struct { X string Y string } type D struct { B Z string }

Quiero reflexionar sobre D y llegar a los campos X, Y, Z.

Intuitivamente, antes de intentar la solución, asumí que sería capaz de atravesar la estructura D y obtener todos los campos utilizando la reflexión (X, Y, Z) y no tendré que lidiar con B.

Pero como puede ver, solo veo la estructura B incrustada utilizando la reflexión y no sus campos.

http://play.golang.org/p/qZQD5GdTA8

¿Hay alguna manera de hacer que B sea completamente transparente al reflexionar sobre D?

¿Por qué quiero esto?

Imágenes de una estructura común (B en el ejemplo aquí), que se usa en otras estructuras múltiples mediante incrustación. Usando la reflexión, el intento es copiar D en otra estructura similar en un paquete diferente. La estructura de destino para copiar tendrá todos los atributos distribuidos de forma plana (no se insertará allí). Por lo tanto, hay una falta de coincidencia entre el origen y el destino (incrustación versus no incrustación) pero todos los atributos establecidos de manera plana son los mismos. No quiero crear soluciones personalizadas para cada estructura.


La ''transparencia'' que esperaba es solo azúcar sintáctica y no tiene nada que ver con la representación de datos. Si desea tener una función que aplaque su estructura de datos, tendría que escribirla usted mismo.

Por ejemplo ( en juego ):

func DeepFields(iface interface{}) []reflect.Value { fields := make([]reflect.Value, 0) ifv := reflect.ValueOf(iface) ift := reflect.TypeOf(iface) for i := 0; i < ift.NumField(); i++ { v := ifv.Field(i) switch v.Kind() { case reflect.Struct: fields = append(fields, DeepFields(v.Interface())...) default: fields = append(fields, v) } } return fields }