Der meiste Code sollte diese Art der dynamischen Suche nicht benötigen. Es ist ineffizient im Vergleich zum direkten Zugriff (der Compiler kennt den Versatz des X-Felds in einer Vertex-Struktur, er kann vX zu einer einzelnen Maschinenanweisung kompilieren, während eine dynamische Suche eine Art Hash-Tabellenimplementierung oder ähnliches erfordert). Es verhindert auch die statische Typisierung: Der Compiler kann nicht überprüfen, ob Sie nicht versuchen, dynamisch auf unbekannte Felder zuzugreifen, und er kann nicht wissen, wie der resultierende Typ aussehen soll.
Aber ... die Sprache bietet ein Reflektionsmodul für die seltenen Fälle, in denen Sie dies benötigen.
package main
import "fmt"
import "reflect"
type Vertex struct {
X int
Y int
}
func main() {
v := Vertex{1, 2}
fmt.Println(getField(&v, "X"))
}
func getField(v *Vertex, field string) int {
r := reflect.ValueOf(v)
f := reflect.Indirect(r).FieldByName(field)
return int(f.Int())
}
Hier gibt es keine Fehlerprüfung, sodass Sie in Panik geraten, wenn Sie nach einem Feld fragen, das nicht vorhanden ist, oder wenn das Feld nicht vom Typ int ist. Weitere Informationen finden Sie in der Dokumentation .