Go 1.4 发布:支持 Android,改进垃圾收集器

阅读数:2597 2014 年 12 月 11 日

话题:GoogleAndroid语言 & 开发架构

在 Go 1.3 发布 6 个月之后,Google宣布发布 Go 1.4。Go 1.4 正式支持 Android 原生开发,不过这方面的工作还处于繁重的开发之中。该版本还改进了垃圾收集器,语言方面也有少许变化。

InfoQ 数月前曾报道过,Google 的工程师正在为支持用 Go 语言开发原生 Android 应用而努力。随着 Go 1.4 的发布,向 Android 进行实验性移植的草案已经成为现实,Google 的 Go 团队的工程师 Andrew Gerrand 介绍说,“仅使用 Go 代码编写简单的 Android 应用已经成为可能”。

对 Android 的支持是通过golang.org/x/mobile库实现的,其中包括用于生成语言绑定的包(支持从 Java 调用 Go 代码),还有用于创建一个完整的原生应用的包,再就是一些例子,以及到 OpenGL 的绑定

值得一提的是,Google 的计划并非是基于 Go 提供完整的 Android NDK,而只是支持用 Go 编写 Android 应用的一部分。发布说明中提到:

提供的接口主要针对的是游戏。我们期望的是应用在整个屏幕上绘制(通过 OpenGL,参见 go.mobile/gl 包),不会暴露平台屏幕管理基础设施的任何信息。在 Android 上,这意味着一个原生应用等价于 iOS 上一个单独的 Activity(特别是 NativeActivity) ,一个单独的 UIWindow。触屏事件也可以通过这个包获得。当 Android 支持脱离预览版状态后,Android NDK 支持的所有 API 都将通过一个 Go 包暴露出来。

此外,Andrew 还提到:

在这一阶段,支持库仍然是刚刚起步,还处于繁重的开发之中。早期的使用者应该会遇到不少问题,我们也欢迎社区参与进来。

Go 1.4 在改进垃圾收集器方面也做了很多工作,为将在后面的版本中唱主角的完全并发的收集器打下了基础。此外,现在的栈在必要时会重新分配,以保证连续性,并消除众所周知的“热栈分割(hot stack split)”问题。

工具方面也有改进,go 命令现在支持构建时生成源代码。Andrew 提到,利用该特性,可用使用新的stringer工具为类型常量自动生成 String 方法。

最后,Go 1.4 还对语言做了一些修改,它们是:

  • 新的 for-range 循环形式,支持用

代替

for i := range x {

...

}

  • 禁止在 **T 上调用方法,像 Go 语言的之前版本支持以下形式的方法调用:

type T int

var x **T

x.M()

这种调用方法并不符合 Go 语言规范,规范只允许自动插入一个解引用(dereference)操作。依赖之前行为的代码不能通过编译,但是也很容易修复,只需要显式地对变量解引用。

更多细节,请参考发布说明

查看英文原文:New Go 1.4 Adds Support for Android, Improves Garbage Collection