Golang中WaitGroup使用的一点坑

Golang中WaitGroup使用的一点坑

Golang 中的 WaitGroup 一直是同步 goroutine 的推荐实践。自己用了两年多也没遇到过什么问题。直到一天午睡后,同事扔过来一段奇怪的代码:

坑1

撇了一眼,觉得没什么问题。然而,它的运行结果是这样:

或这样:

或这样:

一度让我以为手上的 mac 也没睡醒……
这个问题如果理解了 WaitGroup 的设计目的就非常容易 fix 啦。因为 WaitGroup 同步的是 goroutine, 而上面的代码却在 goroutine 中进行 Add(1) 操作。因此,可能在这些 goroutine 还没来得及 Add(1) 已经执行 Wait 操作了。

于是代码改成了这样:

坑2

然而,mac 又睡了过去,而且是睡死了过去:

wg 给拷贝传递到了 goroutine 中,导致只有 Add 操作,其实 Done操作是在 wg 的副本执行的。因此 Wait 就死锁了。于是代码改成了这样:

填坑

至此,午睡终于睡醒了。Sigh…

锤子 MIX,锤子 MacBook

锤子 MIX,锤子 MacBook

十月真的是数码爱好者的嘉年华。

在我生日的那天,迎来了锤子 M1/M1L的发布——虽然这跟我是否生日本来没有半毛钱关系。晚饭因为妞儿要为我小小庆祝一下,所以回来只看到了相声晚会的尾声。于是,在看回放的情况下,看到了凌晨两点。坦率讲,因为我内心的感情色彩,我并不适合评价 M1到底怎样,我甚至不太关心它手机做得怎样。关注锤子,更多的是希望理想主义者也可以创业成功,说人话就是,站着也可以挣来干净的钱。从来没有如此迫切的希望一个人、一个企业可以成功,老罗和锤子是第一个。

随后发布的小米 MIX 被行业吹上了天。有时候,追求制造业的极致可以带来体验上的提升的;有时候,去用并不酷炫的手法踏踏实实解决一些实际问题,会带来认同和信任。锤子和小米很多方面行事的区别在于此。

期待了很久的 MacBook Pro 终于更新了。添加了噱头大于实际用处的 Touch Bar,接口全免阉割为 USB-C, 连自家嗯 iPhone 也被淘汰……

对了,标题请用四川话朗读。

iOS deveplopment start with Swift 3.0

iOS deveplopment start with Swift 3.0

Swift 从2.2看到3.0, 但是一直找理由没有做一些实际的项目。节前比较清闲,准备先搭建一个基本的架子。原因是,我平时的大部分开发工作是 Golang 服务器开发,而Golang 是自带标准库的,因此基本看完语言后,就可以对着标准库写东西了。而 Swift 则是语言和库在设计之初就是分离的,因此看完语言基本上是不会走路的。

Swift 3.0当然不是现在性价比最高的入门选择,至少不是线上生产的最佳选择(2016.09.29)。因为去 github 逛一圈,会发现很多库都还没有适配3.0,无奈 Swift 每一个版本都如同一门新的语言,因此,要适配就不是修改三五行就可以搞定的了。本着踩坑然后填坑是最佳实践的原则,Swift 3.0倒是非常不错的入门之选。

准备搭建的架子要使用如下几个 lib:

  1. 日志:CocoaLumberjack
  2. 网络请求:Alamofire
  3. 调试:FLEX

CocoaLumberjack

需要修改 pod, 直接从 git 获取最新代码:

pod 'CocoaLumberjack/Swift', :git => 'https://github.com/CocoaLumberjack/CocoaLumberjack'

CocoaLumberjack 配置Xcode 8使用时,无法通过XcodeColors在 console 彩色输出。解决办法就是通过 emoji 表情:

Alamofire

直接install. 需要注意的是只支持 iOS 9+

FLEX

直接 install. 如果 import 提示找不到 module, 尝试重启 Xcode.

使用 example:

参考