Ist es möglich und wie die reflect.Type eines Typs zu erhalten, ohne ein Objekt aus der Art zu schaffen, und forderte sie auf, reflect.TypeOf(obj)
golang erhalten die reflect.Type eines Typs
Was in Java sein: MyType.class
Ist es möglich und wie die reflect.Type eines Typs zu erhalten, ohne ein Objekt aus der Art zu schaffen, und forderte sie auf, reflect.TypeOf(obj)
golang erhalten die reflect.Type eines Typs
Was in Java sein: MyType.class
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
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
}
Gute Antwort, aber der erste Codeblock hat einen Tippfehler, sollte "t: = reflect.TypeOf (obj)" sein – luochenhuan
Und wenn Sie versuchen, den 'Typ' für' Test' anstatt '* zu bekommen Testen Sie '.Elem()' auf 'Type', das von' TypeOf' zurückgegeben wird. – twotwotwo