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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何使用 r3labs/diff 區(qū)分整個(gè)結(jié)構(gòu)

如何使用 r3labs/diff 區(qū)分整個(gè)結(jié)構(gòu)

Go
ABOUTYOU 2022-10-17 10:05:57
我遇到了github.com/r3labs/diffGo 語言庫來比較相同類型的兩個(gè)結(jié)構(gòu)。庫運(yùn)行良好,除了一個(gè)用例如下:我使用Date結(jié)構(gòu)來表示日期:type Date struct {    Year  int    Month int    Day   int}現(xiàn)在,還有一些其他更復(fù)雜的結(jié)構(gòu)可以使用該Date結(jié)構(gòu),例如:type Student struct {  DateOfBirth Date}如果我要比較兩個(gè)學(xué)生,比如diff.Diff(  Student{DateOfBirth: Date{2021, 11, 13}},  Student{DateOfBirth: Date{2021, 10, 9}},)結(jié)果我會(huì)得到一個(gè)包含 2 個(gè)項(xiàng)目的更改日志,一個(gè)DateOfBirth > Month用于DateOfBirth > Day.我想要的結(jié)果將是一個(gè)帶有單個(gè)項(xiàng)目 ( DateOfBirth) 和2021-10-09.圖書館有可能嗎?
查看完整描述

2 回答

?
翻閱古今

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個(gè)贊

注意此解決方案正在使用github.com/r3labs/diff/v2.

沒有這樣的選擇。diff 只是遞歸地處理結(jié)構(gòu)字段并為每個(gè)不同的字段生成更改日志。

要實(shí)現(xiàn)您想要的輸出,您可以實(shí)現(xiàn)自己的ValueDiffer. 這樣,您可以“原子地”區(qū)分結(jié)構(gòu)并以您想要的格式附加到變更日志。

一個(gè)人為的例子,部分從包內(nèi)部復(fù)制:

type DateDiffer struct {

}


// Whether this differ should be used to match a specific type

func (d *DateDiffer) Match(a, b reflect.Value) bool {

    return diff.AreType(a, b, reflect.TypeOf(Date{}))

}


// The actual diff function, where you also append to the changelog

// using your custom format

func (d *DateDiffer) Diff(cl *diff.Changelog, path []string, a, b reflect.Value) error {

    if a.Kind() == reflect.Invalid {

        cl.Add(diff.CREATE, path, nil, b.Interface())

        return nil

    }

    if b.Kind() == reflect.Invalid {

        cl.Add(diff.DELETE, path, a.Interface(), nil)

        return nil

    }

    var d1, d2 Date

    d1, _ = a.Interface().(Date)

    d2, _ = b.Interface().(Date)

    if d1.Day != d2.Day || d1.Month != d2.Month || d1.Year != d2.Year {

        cl.Add(diff.UPDATE, path, fmt.Sprintf("%d-%d-%d", d1.Year, d1.Month, d1.Day), fmt.Sprintf("%d-%d-%d", d2.Year, d2.Month, d2.Day))

    }

    return nil

}


// unsure what this is actually for, but you must implement it either way

func (d *DateDiffer) InsertParentDiffer(dfunc func(path []string, a, b reflect.Value, p interface{}) error) {

    return

}

然后你這樣使用它:


    d2, _ := diff.NewDiffer(diff.CustomValueDiffers(&DateDiffer{}))


    s1 := Student{DateOfBirth: Date{2021, 11, 13}}

    s2 := Student{DateOfBirth: Date{2021, 10, 9}}


    ch2, _ := d2.Diff(s1, s2)

輸出(編組和縮進(jìn)的 json):


[

  {

   "type": "update",

   "path": [

    "DateOfBirth"

   ],

   "from": "2021-11-13",

   "to": "2021-10-9"

  }

 ]


查看完整回答
反對(duì) 回復(fù) 2022-10-17
?
喵喔喔

TA貢獻(xiàn)1735條經(jīng)驗(yàn) 獲得超5個(gè)贊

經(jīng)過一番研究,我找到了解決方案。


我需要為 the 創(chuàng)建一個(gè)自定義差異,Date并使用DisableStructValues包中的選項(xiàng)。


此選項(xiàng)很有用,因?yàn)樗篂榻Y(jié)構(gòu)中的每個(gè)項(xiàng)目填充單獨(dú)的更改,并在將其與nil值進(jìn)行比較時(shí)返回整個(gè)對(duì)象。


diff.Diff(

  Student{DateOfBirth: Date{2021, 11, 13}},

  Student{DateOfBirth: Date{2021, 10, 9}},

  diff.CustomValueDiffers(differ.DateDiffer{}),

  diff.DisableStructValues()

)

要實(shí)現(xiàn)自定義差異,需要一個(gè)實(shí)現(xiàn)以下接口的新結(jié)構(gòu):


type ValueDiffer interface {

    Match(a, b reflect.Value) bool

    Diff(cl *Changelog, path []string, a, b reflect.Value) error

    InsertParentDiffer(dfunc func(path []string, a, b reflect.Value, p interface{}) error)

}

這是我的自定義不同的實(shí)現(xiàn)。


type DateDiffer struct {

    DiffFunc (func(path []string, a, b reflect.Value, p interface{}) error)

}


func (differ DateDiffer) Match(a, b reflect.Value) bool {

    return diff.AreType(a, b, reflect.TypeOf(Date{}))

}


func (differ DateDiffer) Diff(cl *diff.Changelog, path []string, a, b reflect.Value) error {

    if a.Kind() == reflect.Invalid {

        cl.Add(diff.CREATE, path, nil, b.Interface())

        return nil

    }


    if b.Kind() == reflect.Invalid {

        cl.Add(diff.DELETE, path, a.Interface(), nil)

        return nil

    }


    var source, target Date

    source, _ = a.Interface().(Date)

    target, _ = b.Interface().(Date)

    if !source.Equal(target) {

        cl.Add(diff.UPDATE, path, a.Interface(), b.Interface())

    }


    return nil

}


func (differ DateDiffer) InsertParentDiffer(dfunc func(path []string, a, b reflect.Value, p interface{}) error) {

    differ.DiffFunc = dfunc

}

希望這會(huì)幫助有類似用例的人。


查看完整回答
反對(duì) 回復(fù) 2022-10-17
  • 2 回答
  • 0 關(guān)注
  • 187 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)