如何在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())
}
答案 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字段,只需以大写字母开头即可。