Pointers 通过通道发送指针

Pointers 通过通道发送指针,pointers,go,goroutine,channels,Pointers,Go,Goroutine,Channels,我正在尝试使用通道来实现一种工作池。请看下面的代码 (围棋场) 似乎在worker2接收到指针时,原始变量中的值已经发生了更改,这反映在打印的值中 问题是如何避免这种情况?如何解决这个问题?接收到的指针指向的值不是您期望的值,因为您每次都向它发送指向同一变量的指针,因此工作进程可以看到该变量在取消引用指针时具有的任何值。解决这类问题的一种典型方法是在for循环中复制变量,并发送指向该变量的指针。这样,每次都会向不同的对象发送指针。试试这个: for i := 0; i < 10; i++

我正在尝试使用通道来实现一种工作池。请看下面的代码

(围棋场)

似乎在worker2接收到指针时,原始变量中的值已经发生了更改,这反映在打印的值中


问题是如何避免这种情况?如何解决这个问题?

接收到的指针指向的值不是您期望的值,因为您每次都向它发送指向同一变量的指针,因此工作进程可以看到该变量在取消引用指针时具有的任何值。解决这类问题的一种典型方法是在
for
循环中复制变量,并发送指向该变量的指针。这样,每次都会向不同的对象发送指针。试试这个:

for i := 0; i < 10; i++ {
    fmt.Printf("sending: %v\n", i)
    iCopy := i
    q2 <- &iCopy
}
i:=0的
;i<10;i++{
fmt.Printf(“发送:%v\n”,i)
iCopy:=i

q2中介绍了此问题。下面是一个简短的摘录,其中变量名称已更改,以匹配您的代码:

错误在于,在Go
for
循环中,循环变量在每次迭代中重复使用,因此
i
变量在所有goroutine中共享。这不是我们想要的。我们需要确保
i
对于每个goroutine都是唯一的

接着介绍了两种解决方案:

  • i
    的值作为参数传递给goroutine中的函数
  • 在循环中创建一个新变量并使用它

  • 由于您的goroutine是在循环外部启动的,只有#2适用于您的代码。

    这样做了。它适用于int。在我的例子中,我将发送一个指向我在循环中创建的struct的指针。因此它应该避免了问题,但不起作用。似乎在简单的情况下工作。想知道我的用例有什么问题。我会研究它。谢谢@andy schweigthanks@jrefior。我想答案和Andy Schweig的差不多。
    worker 1
    sending: 0
    got: 0
    sending: 1
    sending: 2
    got: 1
    got: 2
    sending: 3
    sending: 4
    got: 3
    got: 4
    sending: 5
    sending: 6
    got: 5
    got: 6
    sending: 7
    sending: 8
    got: 7
    got: 8
    sending: 9
    got: 9
    
    
    worker 2
    sending: 0
    got: 0
    sending: 1
    sending: 2
    got: 2
    got: 2
    sending: 3
    sending: 4
    got: 4
    got: 4
    sending: 5
    sending: 6
    got: 6
    got: 6
    sending: 7
    sending: 8
    got: 8
    got: 8
    sending: 9
    got: 10
    
    for i := 0; i < 10; i++ {
        fmt.Printf("sending: %v\n", i)
        iCopy := i
        q2 <- &iCopy
    }