第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

僅解組已批準的字段

僅解組已批準的字段

Go
FFIVE 2022-06-01 16:10:10
我正在嘗試授予用戶編輯結構的某些字段的權限。此字段將根據當前用戶的操作、上下文和角色而有所不同。目前我正在以一種命令式的方式執(zhí)行此操作,但它相當乏味且不可擴展。我認為擁有一個列表approved_fields可能是一個很好且更具可擴展性的解決方案,但我不知道如何完成這個。我認為反思是要走的路,但我還不夠了解。任何靈感都會有所幫助。type Foo struct {  Bar1 int  Bar2 int  Bar3 int}foo := Foo{}approved_fields := []string{"Bar1", "Bar2"}decode(json_data, &foo, approved_fields)foo2 := Foo{}approved_fields := []string{"Bar1", "Bar3"}decode(json_data, &foo2, approved_fields)
查看完整描述

1 回答

?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

這是我如何解決它的想法。由于我在有選擇地選擇字段之前解組了整個項目,因此可能會有更有效的方法。


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)

}


查看完整回答
反對 回復 2022-06-01
  • 1 回答
  • 0 關注
  • 115 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號