Golang Go语言中 goroutine 传指针的问题

Golang Go语言中 goroutine 传指针的问题

for {
select {
case msg, ok := <-msgChan:
if !ok {
return
}
limit <- struct{}{}
go func(t *Message) {
send(t)
<-limit
}(msg)
}
}

msg 是*Message

这样的传参会导致 t 被下次循环的 msg 覆盖吗 (其实可以不这么控制并发,如果只能这么写的话


更多关于Golang Go语言中 goroutine 传指针的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

9 回复

不会

更多关于Golang Go语言中 goroutine 传指针的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


:= 出来是一个新的,下一次循环跟上一次没关系

这个 select 么有用,可以删掉。

这里的变量 t 没问题的,但是要小心你其他地方的程序同时操作指针所指向的对象,可能会有意想不到的后果。

对说 不会 的标示存疑 观望中

不会。这里即使用捕获而非传参的方式也不会
但是 go 的 for range 是一个变量要注意别直接 go 捕获

#6
#2
#4
感谢

没有问题,注意与以下的区别:

go func() {
send(msg)
<-limit
}()

这样写就有问题

在Go语言中,goroutine与指针传递是一个常见的主题,特别是在处理并发编程时。理解如何在goroutine中安全地传递指针,对于避免数据竞争和确保程序正确性至关重要。

首先,要明确的是,在Go中,goroutine是通过函数调用来启动的,这些函数可以接受指针作为参数。当你将一个变量的指针传递给一个goroutine时,你实际上是在共享该变量的内存地址。这意味着goroutine和主线程(或其他goroutine)可以访问和修改同一个变量。

这种共享内存的方式需要谨慎处理,以避免数据竞争。数据竞争发生在两个或多个goroutine同时读写同一个内存位置,且至少有一个操作是写操作时。这会导致程序行为变得不可预测,并可能引入难以调试的bug。

为了避免数据竞争,你可以使用Go的并发原语,如互斥锁(sync.Mutex)或通道(channel)。互斥锁可以用来保护共享资源,确保在同一时间只有一个goroutine可以访问该资源。通道则提供了一种在goroutine之间安全传递数据的方式,它们内置了同步机制,可以确保数据在发送和接收时不会发生冲突。

总之,在Go语言中,将指针传递给goroutine是可行的,但你需要仔细考虑并发访问的同步问题。通过使用适当的并发控制机制,你可以确保程序在并发环境下的正确性和稳定性。

回到顶部