请教一个 Golang Go语言问题
第一种写法
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)
}
}
请问下上面两种写法,哪一种更好,为什么?除了以上方法还有其他更好的实现?感谢
请教一个 Golang Go语言问题
更多关于请教一个 Golang Go语言问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你这样写,bus 变量在 goroutine 里面运用,需不需要加锁啊?
topic 的地址会变哦,你这么写有问题的,如果不考虑我觉得第二种效率可能要高一些
topic 变量只会在循环开始的时候声明一次,后面每次循环都只是修改这个变量的值。
循环里面闭包引用的 topic 都是同一个,值会被修改。
赞同 3 楼
经典 for 循环 v 值变更,最后 topic 循环内需要重新声明下
当然可以,以下是对该帖子的专业回复:
你好,很高兴你提出了关于Golang(Go语言)的问题。虽然你没有具体说明遇到的问题是什么,但我会尽力提供一些常见的Go语言问题和解决方案,希望能对你有所帮助。
-
环境配置:如果你刚开始接触Go语言,确保你已经正确安装了Go编译器和设置了GOPATH或GOMODULE。这是进行Go语言开发的基础。
-
并发编程:Go语言以其强大的并发处理能力著称。如果你对goroutines、channels或select语句有疑问,建议查阅官方文档或相关教程,这些特性对于理解Go语言的并发模型至关重要。
-
错误处理:Go语言中的错误处理通常通过返回错误值来实现。了解如何优雅地处理错误,避免使用异常机制,是掌握Go语言的关键。
-
内存管理:Go语言有垃圾回收机制,但开发者仍需注意内存泄漏和性能优化。了解Go语言的垃圾回收原理,以及如何编写高效的代码,对于大型项目的成功至关重要。
-
标准库和第三方库:Go语言的标准库非常丰富,涵盖了很多常用的功能。同时,也有很多优秀的第三方库可供使用。学会利用这些资源,可以大大提高你的开发效率。
如果你有更具体的问题,比如某个语法点的疑问、某个库的使用方法等,请详细描述你的问题,我会尽力给出更具体的解答。
希望这些信息能对你有所帮助,祝你在Go语言的学习之路上越走越远!