2017-01-07 2 views
-2

Angenommen, ich habe folgendes:Assert-Typ basierend auf einer Zeichenfolge?

type T struct { Name string } 

Dann erstelle ich eine var vom Typ T:

thing := T{"Hello World"} 

ich die Art dann reflektieren:

t := reflect.TypeOf(thing) // main.T 

Dann gehe ich t um eine Methode, die eine Schnittstelle akzeptiert, kann ich dann in dieser Methode sagen, dass die akzeptierte interface{} vom Typistwenn ich diese Zeichenfolge habe?

Der Anwendungsfall ist ich habe eine JSON-Zeichenfolge, die einen Typ passt. Ich habe eine Zeichenfolge dieses Typs (main.T), und ich möchte in der Lage sein, eine neue Variable vom Typ main.t zu erstellen, wenn ich nur die Zeichenfolge kenne, main.T dann marshale die Daten auf diese neue Variable.

+3

Ich verstehe nicht. Variablen erscheinen im Quellcode, sie werden zur Kompilierzeit überprüft. Es gibt keine dynamische Variable (oder Variablen dynamischer Typen). Warum ist der variable Typ überhaupt von Bedeutung? Was versuchst du stromabwärts zu machen? –

Antwort

0

Die Go-Laufzeit bietet keine Möglichkeit, einen Wert der Name einer Art gegeben zu schaffen, aber das ist etwas, das Sie in der Anwendung implementieren können:

var types = map[string]reflect.Type{ 
    "main.T": reflect.TypeOf((*T)(nil)).Elem(), 
} 

Sie einen neuen Wert den Namen gegeben erstellen können mit :

v := reflect.New(types[name]).Interface() 

Dies setzt voraus, dass Name ein gültiger Name ist. Sie können nach dem Fall suchen, in dem Typen [Name] == Nil.

playground example

Sie können dies auch tun, ohne Reflexion:

var types = map[string]func() interface{} { 
    "main.T": func() interface{} { return &T{} } 
} 

v := types[name]() 
Verwandte Themen