下麵給出簡單的代碼,這裡通過將變數重置為零來實現過濾欄位的目的: 如果不希望使用二次映射,可以考慮使用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成員函數。