2016-05-24 5 views
1

Wie listet man die Felder und Methoden einer Struktur in GoLang dynamisch auf? Zum Beispiel möchte ich die Ausgabe als ID, Name, Alter und alle Methodennamen erhalten.Listet die Strukturfelder und Methoden dynamisch auf

type Student struct { 
    id int 
    name string 
    age int 
} 

func (s *Student) setId(i int) { 
    s.id = i 
} 

func (s *Student) getId() int { 
    return s.id 
} 

func (s *Student) setName(n string) { 
    s.name = n 
} 

func (s *Student) getName() string { 
    return s.name 
} 

func (s *Student) setAge(a int) { 
    s.age = a 
} 

func (s *Student) getAge() int { 
    return s.age 
} 

func main() { 
    st := Student{1,"Jack",22} 
    fmt.Println(st.getId()," ",st.getName()," ",st.getAge()) 

} 
+0

Sind Sie sicher, dass Sie nicht nur an einer String-Repräsentation des Objekts interessiert sind und die 'Stringer'-Schnittstelle implementieren möchten? –

+0

welche Ausgabe möchten Sie? – Apin

+0

Zugehöriges/mögliches Duplikat von [Wie wird struct mit String() von Feldern gedruckt?] (Http://stackoverflow.com/questions/33142594/how-to-print-struct-with-string-of-fields) – icza

Antwort

2

Um Informationen über eine Struktur zur Laufzeit zu erhalten, müssen Sie das Paket reflect verwenden. Ermitteln Sie zuerst den Typ der Struktur und dann können Sie sie durchlaufen. Beachten Sie jedoch, dass für den Typ main.Student keine Methoden zugeordnet sind, sondern der Typ *main.Student. Hier

ist ein Beispiel dafür, wie Sie diese Informationen abrufen können:

func main() { 
    s := Student{1, "Jack", 22} 
    t := reflect.TypeOf(s) 
    ptr_t := reflect.TypeOf(&s) 

    methods := make([]string, 0) 
    for i := 0; i < ptr_t.NumMethod(); i++ { 
     methods = append(methods, ptr_t.Method(i).Name) 
    } 

    fields := make([]string, 0) 
    for i := 0; i < t.NumField(); i++ { 
     fields = append(fields, t.Field(i).Name) 
    } 

    fmt.Println(methods) 
    # [getAge getId getName setAge setId setName] 
    fmt.Println(fields) 
    # [id name age] 

} 

Ein Punkt über Ihren Code: schauen, wie der Export von Feldern und Methoden zwischen Paket erfolgt. Weil alle Felder und Methoden, die mit einem Kleinbuchstaben beginnen, außerhalb des Pakets nicht zugänglich sind. Sie müssen sie mit einem Großbuchstaben beginnen.

Ein weiterer Punkt: Es gibt normalerweise keine Getter und Setter in Go-Code. Wenn Sie ein Strukturfeld lesen und schreiben wollen, starten Sie es einfach mit einem Großbuchstaben.

+0

Vielen Dank! –

Verwandte Themen