reflect playground playgo golang go types instance go-reflect

playground - playgo golang



Instancia nuevo tipo(Golang) (2)

¿Alguien puede decirme cómo crear una nueva instancia de Type a partir de una cadena? ¿Reflejar?

Hay ejemplos, pero son para las versiones más antiguas (versiones anteriores a Go 1) del lenguaje [:(]


Entonces, si entiendo su pregunta correctamente, usted está preguntando acerca de cómo puede crear un objeto cuando solo tiene el nombre del tipo como cadena. Entonces, por ejemplo, podría tener una cadena "MyStruct" y desea crear un objeto de este tipo.

Desafortunadamente, eso no es fácil porque Go es un lenguaje estático y el enlazador eliminará el código muerto (o partes integradas de él). Por lo tanto, no hay garantía de que su ejecutable final incluso contenga el código de "MyStruct".

Sin embargo, puede mantener un map[string]reflect.Type global map[string]reflect.Type manualmente. Por ejemplo, al inicializar este mapa en la función init() de sus paquetes, que define los tipos que se pueden descubrir. Esto también le dirá al compilador que está utilizando los tipos. Luego, puede usar este mapa para buscar el reflect.Type el tipo que desea crear y use reflect.New para obtener un puntero a un nuevo objeto de ese tipo (almacenado como un reflejo.Valor). Puedes extraer el objeto en una interfaz con algo como esto:

reflect.New(yourtype).Elem().Interface()

Elem() el puntero y la Interface() devolverá el valor reflejado como una interface{} . Vea Las leyes de la reflexión para más detalles.

PD: Podría haber una mejor manera de estructurar su programa que ni siquiera requiera reflexión y que permita al compilador detectar más errores. ¿Ha considerado utilizar un método de fábrica, por ejemplo? Otra solución fácil podría ser mantener un map[string]func() interface{} de funciones que se pueden invocar para crear un nuevo objeto con ese nombre.


La fábrica con constructores predefinidos se puede basar en algo como:

package main import ( "fmt" ) type Creator func() interface{} type A struct { a int } type B struct { a bool } func NewA() interface{} { return new(A) } func NewB() interface{} { return new(B) } func main() { m := map[string]Creator{} m["A"] = NewA m["B"] = NewB for k, v := range m { fmt.Printf("%v -> %v/n", k, v()) } }