2016-05-26 2 views

Antwort

6

Sie dies mit folgenden Syntax ohne Instanziierung erreichen können;

package main 

import (
    "fmt" 
    "reflect" 
) 

type Test struct { 
} 


func main() { 
    fmt.Println(reflect.TypeOf((*Test)(nil)).Elem()) 
} 

Spiel; https://play.golang.org/p/SkmBNt5Js6

Auch im Beispiel wird hier gezeigt; https://golang.org/pkg/reflect/#example_TypeOf

+1

Und wenn Sie versuchen, den 'Typ' für' Test' anstatt '* zu bekommen Testen Sie '.Elem()' auf 'Type', das von' TypeOf' zurückgegeben wird. – twotwotwo

3

Nein, Sie können es nicht direkt haben, da in Go-Strukturen keine Felder verfügbar sind, um ihren Typ zu erhalten.

Man denkt es von Tweaking indem Sie folgendermaßen vorgehen:

type object struct {} 

func main() { 
    var obj object 
    t := reflect.TypeOf(object) 
    fmt.Println(t) 
    // main.object 
} 

jedoch in Go jede Variable mit seinem Nullwert initialisiert, so ist dies vollkommen äquivalent zu:

t := reflect.TypeOf(object{}) 
// main.object 

Wenn Sie sich den Quellcode von Golang ansehen, werden Sie sehen, dass reflect.Type eine Schnittstelle ist, die je nach Typ unterschiedlich implementiert ist, aber Sie haben keinen Zugriff auf diese Informationen.

Aber was Sie tun können, ist der Typ eines Zeigers auf die Struktur und von dort erhalten Sie den tatsächlichen Typ. Das Verfahren ist das gleiche, mit der Ausnahme, dass eine Null des Zeigerwert ist nil, so dauert es weniger Zeit zu instanziiert:

func main() { 
    ptr_t := reflect.TypeOf((*object)(nil)) 
    fmt.Println(ptr_t) 
    // *main.object 

    t := ptr_t.Elem() 
    fmt.Println(t) 
    // main.object 
} 
+0

Gute Antwort, aber der erste Codeblock hat einen Tippfehler, sollte "t: = reflect.TypeOf (obj)" sein – luochenhuan

Verwandte Themen