繁体   English   中英

Goland:去抖动按 id 分组的结构 map

[英]Goland: Debounce a struct map grouped by id

我试图弄清楚是否有办法消除按 id 分组的结构 map。

在此示例中使用以下结构:

type Message struct {
    id    int
    attrs []string
}

这就是我创建列表的方式

messages := []Message{
        Message{
            id:    10,
            attrs: []string{"blah", "foo"},
        },
        Message{
            id:    10,
            attrs: []string{"add", "ddsds"},
        },
        Message{
            id:    11,
            attrs: []string{"foo", "bar"},
        },
        Message{
            id:    12,
            attrs: []string{"xyz"},
        },
    }

然后变成按 id 分组的 map:

collections := make(map[int][]Message)

    for _, j := range messages {
        collections[j.id] = append(collections[j.id], j)
    }

这是主要的function:

debounced := debounce.New(100 * time.Millisecond)

    for _, messageMap := range collections {
        for _, message := range messageMap {
            debounced(func() {
                fmt.Println("id", message.id, "attrs =>", message.attrs)
            })
        }
    }

    time.Sleep(500 * time.Millisecond)

output 是:

id 12 attrs => [xyz]

这是不正确的。 看起来它刚刚收到最后一条消息。

我让它工作。 我只需要在第一个循环之后等待:

debounced := debounce.New(100 * time.Millisecond)

    for _, messageMap := range collections {
        for _, message := range messageMap {
            message := message // Copy the loop var
            debounced(func() {
                fmt.Println("id", message.id, "attrs =>", message.attrs)
            })
        }
        time.Sleep(500 * time.Millisecond)
    }

使用闭包,您可以捕获循环变量,每次迭代都会重写该变量。 捕获它的副本:

for _, message := range messageMap {
            message:=message  // Copy the loop var
            debounced(func() {
                fmt.Println("id", message.id, "attrs =>", message.attrs)
            })
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM