最近采用golang编程语言开发,深刻体会到了golang语言并行的便利性,但是也带来了一些小问题,
问题不大,我们来解决。先来看一下什么是并发。
什么是并行? 什么是并发?
golang中,我们都是说的并行,努力挖掘机器的潜能,充分利用机器的多核特性,使代码执行效率最高。
golang中并行利用的是语言的内置函数 go ,来起一个协程。这个协程就叫 goroutine
goroutine是建立在线程之上的轻量级的抽象。在Go语言中,当一个函数被创建为goroutine时,Go会将其视为一个独立的工作单元,并且能够以非常低的代价实现并行执行多个goroutine。
说一说,今天遇到的问题,
我在一个循环中,起了一组goroutinue ,每个协程去执行一个函数,在这个函数中,
func (s *ServiceImpl) getData(
ctx context.Context,
aa int64,
where []string,
) (data Data,err error) {
queryWhere := where
发现每次请求都会有问题,
每次会查询十条数据,但是每次的组装SQL都有问题,有问题的SQL也是随机的。
于是我在代码中打印日志看一下,
发现日志输出,结果居然也正常了
这就奇怪了,添加一句打日志的代码就正确了,
去除 日志代码,问题又100%复现。
最终各种查找问题,突然发现,queryWhere是一个slice ,
还是基础知识问题呀,golang中slice在底层用的是数组,而且是复用的数组,
把代码改成
func (s *ServiceImpl) getData(
ctx context.Context,
aa int64,
where []string,
) (data Data,err error) {
queryWhere := make([]string, len(where))
copy(queryWhere, where)
不添加日志语句,问题也解决了。
还是得多打基础呀
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。