Go1.1新特性介绍(语言和库更完善/性能提高约30%)
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特性, 详细介绍:
- http://gcc.gnu.org/gcc-4.8/changes.html#go
根据golang-nuts的消息, 4月第1周可能会进入Go1.1发布流程(就是下周). 要修复的问题还剩20多一点的, 估计应该不会出现大的延期.
- http://swtch.com/~rsc/go11.html
补充: Go1.1正式版本已经于2013.05.14正式发布.
补充: 目前还标记为Go1.1的剩余BUG主要是gccgo相关的, gccgo1.1的发布流程和GCC4.8.1同步.
Go1.1主要的目标是性能的优化和一些bug的修复, 详细内容参考:
- https://go.googlecode.com/hg/doc/go1.1.html
- http://tip.golang.org/doc/go1.1
关于Go的性能测试数据(性能和C语言gcc -O2
性能基本没有差异):
- Go自带的测试程序结果
- BenchmarksGame的测试结果
补充: 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值的一个闭包. 比如有一个实现了Writer
的 w
值, 那么 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规范, 对函数的终结语句做了定义:
- https://go.googlecode.com/hg/doc/gospec.html#Terminatingstatements
主要有以下几种类型:
- return或者goto语句
- 调用内置的panic函数
- if语句: 必须带else, 并且if和else部分都有明确的终结语句
- for语句: 死循环的类型(无退出条件和break语句)
- switch语句: 没有break语句, 必须有default分支, 每个分支都有终结语句(或者是fallthrough到下个分支的终结语句)
- select语句: 无break语句, 必须有default分支, 每个分支都有终结语句
- 用于goto的Label
已有的代码可以不用更新, 当然有些代码可以写的更简化.
|
评论暂时关闭