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