下面给出简单的代码,这里通过将变量重置为零来实现过滤字段的目的:
type student struct {
age int `json:"age,omitempty"`
name string `json:"name,omitempty"`
school string `json:"school,omitempty"`
}
var st = student{
age: 10,
name: "john smith",
school: "a high school",
}
var dic = map[string]int{
"age": 0,
"name": 1,
"school": 2,
}
var filters = []string{
"name",
"school",
}
func initstudentelems(st *student, fields []string) bool {
v := reflect.indirect(reflect.valueof(st))
for _, field := range fields {
idx, exist := dic[field]
if !exist {
return false
}
vf := v.field(idx)
vf.set(reflect.zero(vf.type()))
}
return true
}
func printmarshalident(st *student) error {
b, err := json.marshalindent(st, "", " ")
if err != nil {
return err
}
fmt.println(string(b))
return nil
}
func main() {
printmarshalident(&st)
initstudentelems(&st, filters)
printmarshalident(&st)
}
如果不希望使用二次映射,可以考虑使用reflect库中,value结构体的fieldbyname成员函数。
如对本文有疑问, 点击进行留言回复!!
尚硅谷JVM从入门到精通宋红康版|第十六章、垃圾回收相关概念
网友评论