-
Go语言高并发时append方法偶现错误的解决方法
在实现图片转码的需求时,需要支持最大 500 个图片下载后转换格式; 如果是一个一个下载后转码,耗时太长,需要使用 goroutine 实现 500 个图片并发下载后,并发转码; 但自测过程中发现,会偶现下载后只转换了 499 个图片或更少的情况(全部下载、转码成功的条件下); 然后就开始了打印日志找 bug 的过程。 排查问题 因为并发时使用到了 sync 等待全部协程结束,起初以为是 sync 异步等待出了问题; 打印日志发现,正常执行了 500 次下载,执行完成下载之后,继续执行的转码操作…
-
Go语言中浅拷贝和深拷贝的区别是什么?
要想搞明白深拷贝和浅拷贝的区别,我们需要先弄懂以下几点: 一、值类型和引用类型 Go 语言里面变量有两类,一类是值类型,一类是引用类型。 两者区别是什么呢? 我们在电脑里面创建的变量,都是需要内存来存放的。 值变量就是直接,一个内存地址对应一个值。 而引用变量,则是某个值存放的是另一个值的地址。 我画了一个逻辑图,帮助我们去理解这个概念。 在 Go 语言中: string、int、bool、float 等这些都属于值类型 slice、map、chan 等这些都属于引用类型 二、什么是浅拷贝和深拷…