整数除以零是编译错误
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值的一个闭包. 比如有一个实现了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规范, 对函数的终结语句做了定义:
主要有以下几种类型:
return或者goto语句
调用内置的panic函数
if语句: 必须带else, 并且if和else部分都有明确的终结语句
for语句: 死循环的类型(无退出条件和break语句)
switch语句: 没有break语句, 必须有default分支, 每个分支都有终结语句(或者是fallthrough到下个分支的终结语句)
select语句: 无break语句, 必须有default分支, 每个分支都有终结语句
用于goto的Label
已有的代码可以不用更新, 当然有些代码可以写的更简化.