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

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

比較 2 個切片以查看哪個元素已被刪除的慣用方法

比較 2 個切片以查看哪個元素已被刪除的慣用方法

Go
翻翻過去那場雪 2021-12-06 19:30:46
我在我的應(yīng)用程序中使用RethinkDB,我有一個有用戶的大廳。RethinkDB 能夠監(jiān)視表的更改,當(dāng)發(fā)生更改時,它會自動發(fā)出更改,以便您可以對數(shù)據(jù)做任何想做的事情,現(xiàn)在我正在嘗試這樣做,以便當(dāng)用戶離開大廳時我可以發(fā)送一個用于刪除用戶的 websocket。唯一的事情是我試圖找出之前/之后數(shù)據(jù)的不同之處,這是一個切片members,這是數(shù)據(jù):type change struct {    NewVal *fields `gorethink:"new_val,omitempty"`    OldVal *fields `gorethink:"old_val,omitempty"`}type fields struct {    ID      string `gorethink:"id"`    Owner   string `gorethink:"owner"`    Inqueue bool   `gorethink:"inqueue"`    Members []struct {        SteamID  string `gorethink:"steamid"`        Username string `gorethink:"username"`    } `gorethink:"members"`    Messages []struct {        Username  string    `gorethink:"username"`        Message   string    `gorethink:"message"`        CreatedAt time.Time `gorethink:"createdAt"`    } `gorethink:"messages"`}現(xiàn)在我在做func (l *lobby) watchChanges() {    db := common.DB()    query := gorethink.Table("Lobbys").Get(l.ID).Changes()    res, err := query.Run(db)    if err != nil {        log.Println(err)    }    go func(res *gorethink.Cursor, l *lobby) {        defer res.Close()        changes := new(change)        for res.Next(&changes) {            if changes.NewVal != nil && changes.OldVal != nil {                switch {                case len(changes.NewVal.Members) > len(changes.OldVal.Members):                    // Member has joined so announce who it was.                case len(changes.NewVal.Members) < len(changes.OldVal.Members):                    // Member has left so announce who it was.           -------->                case len(changes.NewVal.Messages) > len(changes.OldVal.Messages):                    // New Message was recieved so announce the message.                }            }        }    }(res, l)    select {    case <-l.KillMe:        res.Close()        break    }}新條目很簡單,我只是將切片的末尾取下并發(fā)送,但是當(dāng)涉及到用戶離開時,我如何比較changes.NewVal.Members和changes.OldVal.Members查看刪除了哪個索引,以便我可以發(fā)送正確的成員來刪除通過網(wǎng)絡(luò)套接字。希望我的問題很清楚,如果不是,請告訴我。但感覺有點hacky,有沒有更好的方法?
查看完整描述

1 回答

?
千萬里不及你

TA貢獻1784條經(jīng)驗 獲得超9個贊

按唯一且可排序的鍵對舊成員和新成員進行排序??雌饋?SteamID 可能適合此目的。通過比較鍵,遍歷兩個切片檢查添加和刪除的元素。


func diff(old []*member, new []*member) {

  sort.Sort(bySteamID(old))

  sort.Sort(bySteamID(new))

  i, j := 0, 0

  for i < len(old) && j < len(new) {

    switch {

    case old[i].SteamID < new[j].SteamID:

        fmt.Println(" delete", old[i].SteamID)

        i++

    case old[i].SteamID > new[j].SteamID:

        fmt.Println(" add", new[j].SteamID)

        j++

    default:

        i++

        j++

    }

  }

  for i < len(old) {

    fmt.Println(" delete", old[i].SteamID)

    i++

  }

  for j < len(new) {

    fmt.Println(" add", new[j].SteamID)

    j++

  }

}

playground example


查看完整回答
反對 回復(fù) 2021-12-06
  • 1 回答
  • 0 關(guān)注
  • 216 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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