欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

将golang中变量重置为零的reflect方法

程序员文章站 2022-04-16 09:10:39
下面给出简单的代码,这里通过将变量重置为零来实现过滤字段的目的: 如果不希望使用二次映射,可以考虑使用reflect库中,Value结构体的FieldByName成员函数。 ......

下面给出简单的代码,这里通过将变量重置为零来实现过滤字段的目的:

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成员函数。