Go1.1新特性介绍(语言和库更完善/性能提高约30%

整数除以零是编译错误

Unicode代理区码点不能用于面值

方法值和方法表达式

Return requirements

实现和工具的变化

gccgo的变化

命令行参数解析

64位系统 int 大小为int64

64位平台的堆大小

Unicode

Race detector

gc assemblers

go 的变化

go test 的变化

go fix 的变化

新的构建约束

新支持的平台

交叉编译

性能优化

标准库的变化

前几天GCC4.8发布, 已经部分包含Go1.1特性, 详细介绍:

根据golang-nuts的消息, 4月第1周可能会进入Go1.1发布流程(就是下周). 要修复的问题还剩20多一点的, 估计应该不会出现大的延期.

补充: Go1.1正式版本已经于2013.05.14正式发布.

补充: 目前还标记为Go1.1的剩余BUG主要是gccgo相关的, gccgo1.1的发布流程和GCC4.8.1同步.

Go1.1主要的目标是性能的优化和一些bug的修复, 详细内容参考:

关于Go的性能测试数据(性能和C语言gcc -O2性能基本没有差异):

补充: BenchmarksGame的测试不同语言实现差别较大, 比如: Go的binary-trees开了很多goroutine, C的程序开了omp优化等.

Go1.1的更新主要涉及 语言/实现/性能优化/标准库 几个部分.

补充: Go1.1的二进制安装包将包含gotour程序(启动命令: go tool tour).

语言的改变

Go1发布时曾作出承诺, 保证在Go1.x发布后不会修改之前的语言特性. 这里有一些问题的修复, 还有一些新增加的特性.

整数除以零是编译错误

在Go1中, 整数被一个常量0除会导致一个运行时 panic:

func f(x int) int { return x/0 }

在 Go1.1 中, 整数被一个常量0将会被当作一个编译错误处理.

Unicode代理区码点不能用于面值

字符串和 rune 字面值的定义更加严格. Unicode代理区码点不能用于面值. 细节请参考后面的 Unicode 章节.

方法值和方法表达式

Go1.1新实现了方法值(method values), 它是绑定到receiver值的一个闭包. 比如有一个实现了Writerw 值, 那么 w.Write 将等价于下面的闭包函数:

func (p []byte) (n int, err error) { return w.Write(p) }

方法值(method values)不同于方法表达式(method expressions), 方法表达式是从一个类型对应的函数. 比如 (*bufio.Writer).Write 和下面的普通函数类型:

func (w *bufio.Writer, p []byte) (n int, err error) { return w.Write(p) }

更新: 现有的代码不需要更新, 这个是新加的特性.

GoSpec中给出了很多例子:

f := t.Mv; f(7) // like t.Mv(7) f := pt.Mp; f(7) // like pt.Mp(7) f := pt.Mv; f(7) // like (*pt).Mv(7) f := t.Mp; f(7) // like (&t).Mp(7) f := makeT().Mp // invalid: result of makeT() is not addressable

有了方法值, Go1.1可以从interface值中取出方法值(Go1.0不支持方法值):

var i interface { M(int) } = myVal f := i.M; f(7) // like i.M(7)

这样改动的好处是类型的方法和interface方法完全统一了.

Return requirements

在Go1.1之前, 函数如果有返回值的话, 则最后必须有一个retune或panic语句.

func abs(x int) int { if x >= 0 { return x } else { return -x } }

会有以下编译错误:

function ends without a return statement

之前一般可以在末尾加一个panic来回避这个问题:

func abs(x int) int { if x >= 0 { return x } else { return -x } panic("not reachable") }

在Go1.1规范, 对函数的终结语句做了定义:

主要有以下几种类型:

return或者goto语句

调用内置的panic函数

if语句: 必须带else, 并且if和else部分都有明确的终结语句

for语句: 死循环的类型(无退出条件和break语句)

switch语句: 没有break语句, 必须有default分支, 每个分支都有终结语句(或者是fallthrough到下个分支的终结语句)

select语句: 无break语句, 必须有default分支, 每个分支都有终结语句

用于goto的Label

已有的代码可以不用更新, 当然有些代码可以写的更简化.

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/54a1bb65eae3c2ff3c90f3c371326569.html