汪汪一只猫
这是我如何解决它的想法。由于我在有选择地选择字段之前解组了整个项目,因此可能会有更有效的方法。import ( "encoding/json" "log" "reflect" "github.com/pkg/errors")func fieldByName(s string, v interface{}) (reflect.Value, error) { el := reflect.ValueOf(v).Elem() fbn := el.FieldByName(s) if !fbn.IsValid() { return fbn, errors.Errorf("does not have field named %s", s) } return fbn, nil}func decode(data []byte, v interface{}, approvedFields []string) error { typeOf := reflect.TypeOf(v) if typeOf.Kind() == reflect.Ptr { typeOf = typeOf.Elem() } if typeOf.Kind() == reflect.Slice { return errors.New("does not support slices") } newItem := reflect.New(typeOf) newItemInterface := newItem.Interface() if err := json.Unmarshal(data, &newItemInterface); err != nil { return errors.Wrap(err, "json unmarshall") } for _, approvedField := range approvedFields { fbn, err := fieldByName(approvedField, v) if err != nil { return errors.Wrap(err, "field by name") } val, _ := fieldByName(approvedField, newItemInterface) fbn.Set(val) } return nil}一个测试:func TestBar1Bar2(t *testing.T) { var json_data []byte { f := &Foo{ Bar1: 1, Bar2: 2, Bar3: 3, } json_data, _ = json.Marshal(f) } approved_fields := []string{"Bar1", "Bar2"} f := &Foo{} err := decode(json_data, f, approved_fields) if err != nil { t.Fatal(err) } assert.Equal(t, f.Bar1, 1) assert.Equal(t, f.Bar2, 2) assert.Equal(t, f.Bar3, 0)}