动态列出结构字段和方法

时间:2016-05-24 06:38:09

标签: go

如何在GoLang中动态列出结构的字段和方法?例如,我想将输出作为id,name,age和所有方法名称。

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())

}

1 个答案:

答案 0 :(得分: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代码中通常没有getter和setter。如果要读取和写入struct字段,只需以大写字母开头即可。