许式伟

Go+ 发布 weekly release: v0.6.50

Image

大家好。Go+ weekly release v0.6.50 发布了。Go+ 会坚持每周日晚发布一个版本,这个发布频率会持续到年底 Go+ 1.0 的推出。在此之后,我们会做 Go+ specification 的兼容性承诺。发布周期也会进行必要的调整。

回到 v0.6.50,这个版本更新的内容较多。我们第一次单周 commits 数量超过了 100 个,这也算是一个小小的突破。本周我们也增加了好几位 Contributors,但是由于我们对 Contributor 有严格的定义,而有些小伙伴还在憋大招,所以本周正式授予的新 Contributors 仅有一位(欢迎大家踊跃抢占前 7 位 Contributors 的坑 ^_^)。

这个版本新增了两个全新的命令:qfmt 和 qexp。其中,qfmt 和 go fmt 类似,用于格式化 Go+ 代码。qexp 则用于自动为 Go package 生成 Go+ wrapper,这样就可以在 Go+ 中静态导入对应的 Go package。

在我们的规划中,Go+ 程序可以直接动态导入 Go package,到那时候 qexp 看起来就没有必要存在了。但事实上也并非完全如此。在两个场景下你需要用到 qexp:

其一,在 Go+ 中导入使用了 cgo 的 Go package。在这种情况下,直接让 Go+ import 将会编译无法通过,此时需要用借助 qexp 静态导入 Go package。

其二,性能上的考虑。在 bytecode 模式下,Go+ 毕竟以字节码方式执行,其效率会明显低于 Go。如果某个 Go package 属于性能的热点模块,那么我们可以通过 qexp 静态导入 Go package 即可换来性能的大幅提升(我们写的 Go+ 程序并不需要做任何调整,只需要我们重新编译 gop 程序,将相关的 Go package 静态导入)。

在本次发布中,我们还对既有的 qrun 命令做了功能增强。现在不只可以指定一个目录来运行 Go+ 程序,也支持指定单个 Go+ 文件了(通常以 .gop 作为后缀)。

这让我们 Go+ 程序作为 shell script 有了基础。所以我们本次更新也支持了 Unix shebang,例如:

#!/usr/bin/env qrun

println("Hello, Go+")

println(1r << 129)
println(1/3r + 2/7r*2)

arr := [1, 3, 5, 7, 11, 13, 17, 19]
println(arr)
println([x*x for x <- arr, x > 3])

m := {"Hi": 1, "Go+": 2}
println(m)
println({v: k for k, v <- m})
println([k for k, _ <- m])
println([v for v <- m])

把这段代码保存到某个文件中,并且 chmod +x 去赋上执行权限,它就可以正常执行了。

另外,我们也对两个 Go+ Playground 都做了增强,让它们支持了对 Go+ 代码的格式化。您可以访问以下网址进行体验:

基于 Docker 的 Go+ Playground 访问地址是 https://play.goplus.org/(这个是国际站点,如果国内如果访问不了,可以访问 https://goplay.qiniu.com/ 这个国内站点)。点击阅读原文直接体验 Go+ Playground。

基于 GopherJS 的 Go+ Playground 访问地址是 https://qiniu.github.io/goplus-play/(当前直接托管在 Github 上,可能访问会慢,如果需要我们后面会搭建国内站点)。

其他还有有些零散的功能补全,比如完善 for 循环的支持,fallthrough 关键字的支持,等等。

以下是本次 weekly release 更详细的 Release Notes,我就直接上图了:

Image