请教一个 golang 问题

2023-03-05 23:20:32 +08:00
 ttxshang

第一种写法

func (bus *es) PublicAll(topics []*EventTopic) {
	for _, topic := range topics {
		bus.mutex.Lock()
		h, ok := bus.handlers[topic.Topic]
		bus.mutex.Unlock()
		if !ok {
			continue
		}

		bus.client.Subscribe(topic.Topic, byte(topic.QoSValue), func(c mqtt.Client, m mqtt.Message) {
			go func(h EventHandler) {
				defer func() {
					if err := recover(); err != nil {
						fmt.Printf("goroutine panic: %+v \r\n", err)
					}

				}()
				h(topic.Topic, m)
			}(h)
		})
	}
}

第二种写法


func (bus *es) PublicAll(topics []*EventTopic) {
	for _, topic := range topics {
		bus.mutex.Lock()
		h, ok := bus.handlers[topic.Topic]
		bus.mutex.Unlock()
		if !ok {
			continue
		}

		go func(h EventHandler) {
			defer func() {
				if err := recover(); err != nil {
					fmt.Printf("goroutine panic: %+v \r\n", err)
				}

			}()
			bus.client.Subscribe(topic.Topic, byte(topic.QoSValue), func(c mqtt.Client, m mqtt.Message) {
				h(topic.Topic, m)
			})
		}(h)
	}
}

请问下上面两种写法,哪一种更好,为什么?除了以上方法还有其他更好的实现?感谢

1681 次点击
所在节点    Go 编程语言
6 条回复
Trim21
2023-03-05 23:51:18 +08:00
循环变量 topic 忘复制了吧?
neoblackcap
2023-03-06 01:05:37 +08:00
你这样写,bus 变量在 goroutine 里面运用,需不需要加锁啊?
qwerqqq
2023-03-06 09:58:48 +08:00
topic 的地址会变哦,你这么写有问题的,如果不考虑我觉得第二种效率可能要高一些
yuancoder
2023-03-06 11:08:15 +08:00
topic 变量只会在循环开始的时候声明一次,后面每次循环都只是修改这个变量的值。
循环里面闭包引用的 topic 都是同一个,值会被修改。
hzzhzzdogee
2023-03-06 16:25:21 +08:00
赞同 3 楼
concernedz
2023-03-06 17:08:26 +08:00
经典 for 循环 v 值变更,最后 topic 循环内需要重新声明下

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

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

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

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

© 2021 V2EX