goroutine 传指针的问题

2021-10-14 22:34:44 +08:00
 iyear
for {
		select {
		case msg, ok := <-msgChan:
			if !ok {
				return
			}
			limit <- struct{}{} 
			go func(t *Message) {
				send(t)
				<-limit
			}(msg)
		}
	}

msg 是*Message

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

1768 次点击
所在节点    Go 编程语言
8 条回复
thet
2021-10-14 22:44:43 +08:00
不会
ch2
2021-10-14 23:18:58 +08:00
:= 出来是一个新的,下一次循环跟上一次没关系
rrfeng
2021-10-15 01:32:35 +08:00
这个 select 么有用,可以删掉。
rrfeng
2021-10-15 01:33:52 +08:00
这里的变量 t 没问题的,但是要小心你其他地方的程序同时操作指针所指向的对象,可能会有意想不到的后果。
fenglangjuxu
2021-10-15 10:02:19 +08:00
对说 不会 的标示存疑 观望中
x1aoYao
2021-10-15 11:13:59 +08:00
不会。这里即使用捕获而非传参的方式也不会
但是 go 的 for range 是一个变量要注意别直接 go 捕获
iyear
2021-10-15 11:23:35 +08:00
@x1aoYao #6
@ch2 #2
@rrfeng #4
感谢
index90
2021-10-15 12:19:11 +08:00
没有问题,注意与以下的区别:

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

这样写就有问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/807900

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX