Golang runtime error with macOS Sierra

Golang runtime error with macOS Sierra

If you are on Golang 1.6 or older, you may meet a panic error when you try to build or test your programme or anything else related with runtime:

fatal error: unexpected signal during runtime execution

There is a post about the issue in golang-nuts: [https://groups.google.com/forum/#!topic/golang-nuts/XaVT6fi1g30]. The bug is fixed in Golang 1.7, so just upgrade to 1.7 and you will be happy.

微信小程序——一种可能

微信小程序——一种可能

前天,微信开启了「微信小程序」(即之前张小龙口中的应用号)的公测,迅速刷爆朋友圈。微信如今的规模和对用户时间的霸气占有,让人不得不感慨——微信的每一个公告跟国务院发布通知一样,将影响整个行业。

看下张小龙对「微信小程序」的定义:

什么是小程序:小程序是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或者搜一下即可打开应用。也体现了“用完即走”的理念,用户不关心是否安装太多应用的问题。应用将无处不在,随时随地可用,但又无需安装卸载。

从技术上看,其实没什么新的东西。有人会觉得就是旧瓶装新酒——就是 web app(例如MacTalk 池建强)。但是,做技术的人一定要警惕的一点是:很多时候,应用本身发生的场景比技术本身更重要。例如 twitter 之于碎片时间,facebook 之于社交,微信之于移动互联网。

「小程序」要做的是移动互联网时代的浏览器——这似乎是一个老掉牙的结论。有人会说,这跟百度的轻应用、直达号,以及一众的浏览器内置的 web app 链接(导航)不就是换了一个名称吗。从实现原理和呈现形式上看,的确是这样。这种以 PC 互联网思路打造的占领流量入口型浏览器(广义上),都把一个假设当成了事实:我只要铺安装量,就有流量。这个假设不成立主要有两点原因:

  • 安装量与流量的确是正相关,但是手机的更周期比当年 PC 的更新周期可是短好几倍的。你真的铺的过来?你真的自信一个用户换了3次手机以后你的 app 还能留在他手机上?
  • 绝大部分用户平时使用的 app不超过10个,而80%的时间被一两个 app 占有。而微信已经拿到一张门票,这也就为「移动互联网时代的浏览器」铺垫了前提。其他 app 倒不是不能生存,但是能分到的流量十分有限。

「移动互联网时代的浏览器」有两层含义:

  1. 微信应用号是浏览器。能提供浏览器的是操作系统,微信就是小程序的操作系统。技术细节可以看可能吧作者阿禅罗列的微信提供的组件和接口。简而言之,微信用 native code 为微信小程序打造了一个浏览器,让 web app 可以调用一些 native 接口,具体是哪些哪——这个规则由微信自己制定!有人说,这不还是一个浏览器吗?是也不是。它的确尝试打造一个浏览器,但是这个浏览器依托的土壤异常贴合场景,异常肥沃。总所周知,手机上输入成本大。但是别忘了,一次启动唤醒使用的成本更大——这种成本不会体现在用户每次使用的痛苦上,但是却决定 app 的生死。提供启动唤醒率,排除产品类型和体验上的差距,开发者能做的无非是运营好内容,然后做推送召回。大家回忆两个常识数据:1. 微信公众号文章打开率比其他 app 打开率高多少?2.有app 的推送打开率能超过微信聊天推送打开率的吗?微信能做到这两个数据傲视群雄,不只是因为有张小龙,微信就是为这个场景而生——微信推送的都是用户之前订阅关心的,无论聊天内容还是公众号(从这个角度看,或许你能更加理解为何微信严控公众号每天推送条数了吧);你看 Fenng 不是已经关了微信推送,改为直接人肉轮询微信看消息了……想象一下,如果小程序可以在聊天中使用,是不是好有意思?
  2. 微信应用号是 web app store. 苹果的 app store 多少人眼红以及看不顺眼。但是无奈前面有两堵高墙:硬件和操作系统——能把这两个都玩好的目前也就水果公司一家。Google 无心手机硬件,专注做好了其中一个。微软两个都想拿下,两个都做得掺不忍赌——即使 Windows 占据了90%以上的桌面操作系统。微信两个都搞不定,所以,他选择让自己变成独特的浏览器,开辟一个自己定义规则的新世界——微信的聪明和可怕尽在于此。

有人说,手机上除了微信,还有其他风景。那是当然,只是那里缺少车水马龙的热闹与繁华,而这里提供了一种可能。

Golang正则表达式使用及简单示例

Golang正则表达式使用及简单示例

我发现很多从写脚本转过来写Go代码的开发者都会对Go的正则表达式 (Regular Expression) 功能有微词。普遍觉得其灵活性和完善度都不太给力。其实两个都是有原因的。灵活性其实主要是对Go regexp包的设计哲学不理解。完善度则主要是因为regexp包承诺match的时间与输入长度成线性关系,因此有些表达式就无法支持了, 比如 (?!re)

The regexp implementation provided by this package is guaranteed to run in time linear in the size of the input.

所以,本质上这不是一个「够不够完善」的问题,而是「技术实现决定了它支持程度就是这样」。更多讨论可以关注这里

Go的正则表达式采用RE2语法,详细语法及支持情况可以参阅[这里]。

regex包的设计原则

regexp包的方法命名规则如下:

Find(All)?(String)?(Submatch)?(Index)?

  1. 包含All的方法捕获所有match, 返回值是一个slice. 同时一般会提供一个参数n作为最大匹配次数。
  2. 包含String的方法对string类型进行匹配,反之对[]byte进行匹配。
  3. 包含Submatch的方法返回所有子匹配,返回值是一个slice. 位置0是对应整个正则表达式匹配结果,位置n(n>0)是第n个子表达式(group) 匹配结果。
  4. 包含Index的方法返回匹配的位置。例如,返回loc []int, 则与之对应的匹配字符为src[loc[0]:loc[1]].

匹配Unicode字符

Unicode character class (one-letter name): \pN
Unicode character class: \p{Greek}

含参数