首页 > 文章列表 > 当使用goroutine迭代map并将值作为参数调用时,参数保持不变

当使用goroutine迭代map并将值作为参数调用时,参数保持不变

176 2024-02-02
问题内容

我有以下代码:

type Connection struct {
    Conn *somepackage.Conn // does not matter what this is for this example
    Channel chan []byte
}

var connectionMap map[string]map[string]Connection

...

for connID, conn := range connectionMap["someValue"] {
    fmt.Println(connID, conn)
    go func(c *Connection) {
        fmt.Println("inside fn", connID, c)
    }(&conn)
}

当我运行以下代码时,得到以下输出:

6c2989b7-4e52-48b1-aa6f-60c03c4fe78a {0xc0002dc9a0 0xc0000309c0}
283560e8-2ade-431e-92e2-55751b825c67 {0xc0004f0000 0xc0004981e0}
inside fn 283560e8-2ade-431e-92e2-55751b825c67 &{0xc0004f0000 0xc0004981e0}
inside fn 283560e8-2ade-431e-92e2-55751b825c67 &{0xc0004f0000 0xc0004981e0}

传递给 go 例程的值始终是我迭代的最后一个值。我该如何修复它?

顺便说一句,我将 conn 作为参数传递给 gorountine,看看它是否能解决问题,但它没有解决问题,因为正如你所看到的,connID 没有作为参数传递,这也是我最后一件事迭代


正确答案


谢谢@mkopriva 修改 for 循环修复了它

for connID, conn := range connectionMap["someValue"] {
    connID := connID
    conn := conn
    go func(c *Connection) {
        fmt.Println("inside fn", connID, c)
    }(&conn)
}