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值的一个闭包. 比如有一个实现了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规范, 对函数的终结语句做了定义:

  • 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

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

  • 1
  • 2
  • 下一页

相关内容