请教一个 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

7 回复

循环变量 topic 忘复制了吧?

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


你这样写,bus 变量在 goroutine 里面运用,需不需要加锁啊?

topic 的地址会变哦,你这么写有问题的,如果不考虑我觉得第二种效率可能要高一些

topic 变量只会在循环开始的时候声明一次,后面每次循环都只是修改这个变量的值。
循环里面闭包引用的 topic 都是同一个,值会被修改。

赞同 3 楼

经典 for 循环 v 值变更,最后 topic 循环内需要重新声明下

当然可以,以下是对该帖子的专业回复:


你好,很高兴你提出了关于Golang(Go语言)的问题。虽然你没有具体说明遇到的问题是什么,但我会尽力提供一些常见的Go语言问题和解决方案,希望能对你有所帮助。

  1. 环境配置:如果你刚开始接触Go语言,确保你已经正确安装了Go编译器和设置了GOPATH或GOMODULE。这是进行Go语言开发的基础。

  2. 并发编程:Go语言以其强大的并发处理能力著称。如果你对goroutines、channels或select语句有疑问,建议查阅官方文档或相关教程,这些特性对于理解Go语言的并发模型至关重要。

  3. 错误处理:Go语言中的错误处理通常通过返回错误值来实现。了解如何优雅地处理错误,避免使用异常机制,是掌握Go语言的关键。

  4. 内存管理:Go语言有垃圾回收机制,但开发者仍需注意内存泄漏和性能优化。了解Go语言的垃圾回收原理,以及如何编写高效的代码,对于大型项目的成功至关重要。

  5. 标准库和第三方库:Go语言的标准库非常丰富,涵盖了很多常用的功能。同时,也有很多优秀的第三方库可供使用。学会利用这些资源,可以大大提高你的开发效率。

如果你有更具体的问题,比如某个语法点的疑问、某个库的使用方法等,请详细描述你的问题,我会尽力给出更具体的解答。

希望这些信息能对你有所帮助,祝你在Go语言的学习之路上越走越远!


回到顶部