2016-05-24 2 views
1

Как динамически перечислить поля и методы структуры, в GoLang? Например, я хочу получить вывод как id, имя, возраст и все имена методов.Динамическое отображение структурных полей и методов

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

Вы уверены, что вас просто не интересует строковое представление объекта и хотите реализовать интерфейс 'Stringer'? –

+0

какой выход вы хотите? – Apin

+0

Связанный/возможный дубликат [Как напечатать структуру с помощью String() полей?] (Http://stackoverflow.com/questions/33142594/how-to-print-struct-with-string-of-fields) – icza

ответ

2

Чтобы получить информацию о структуре во время выполнения, вы должны использовать пакет reflect. Во-первых, получите тип структуры, а затем вы можете перебирать ее. Однако в вашем примере имейте в виду, что тип main.Student не имеет связанных методов, но тип *main.Student имеет.

Вот пример того, как вы можете получить эти сведения:

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] 

} 

Точку о вашем коде: посмотрите на то, как экспорт полей и методов между пакетом делается. Поскольку все поля и методы, начинающиеся с строчной буквы, недоступны вне пакета. Вы должны запустить их с заглавной буквы.

Еще один момент: обычно нет геттеров и сеттеров в коде Go. Если вы хотите прочитать и написать поле структуры, просто запустите его с помощью прописной буквы.

+0

Большое вам спасибо! –

Смежные вопросы