282013
 

期待已久的Go1.1终于快发布了。官方已经放出了Go1.1的改动介绍。想看详细信息的可以直接查看原文:Introduction to Go 1.1

这里就主要改动做下介绍

一、语言的改动

1、整数除以0问题

Go1.0x中,整数除以常量0会抛出运行时 panic, Go1.1改成了编译不通过,即 编译时 错误,这样可以早发现问题。主意,是常量0,而不是变量。

2、方法可以作为值

我们知道,在Go中func是一等公民,可以到处使用,比如作为函数参数、赋值给变量。但是方法(Method)却不行,也就是带有receiver的函数不是一等公民。

Go1.1将方法提升为一等公民了。这样,方法可以作为函数参数、赋值给变量等。

3、一直被视为bug的必须”return”问题

在Go1.0x中,如下代码编译不通过:

if true {
     return true
} else {
     return false
}

当然,这样的代码并不好。但有些时候多余的return真的是没有必要。这个问题很多人不可忍。也因为各种给官方提意见,以及一些确实没必要的地方,比如死循环、switch等,导致很多地方会来一句:panic(“unreachable”)。于是,Go1.1允许上面代码的存在。

二、编译器实现和工具链的改动

1、命令行flag解析

在gc工具链中,Go1.1采用了flag包一样的规则解析命令行参数。这使得Unix风格的参数,如go tool 6c -Fw -Dfoo现在必须改为:go tool 6 -F -w -D foo

2、int/uint类型在64-bit平台实现为64bits

Go1.0x中,int/uint在所有平台都是32bits。Go1.1中改为在64-bit平台是64bits,当然32-bit的平台还是32bits。

3、go命令的改动

1)编译、测试或运行go代码,出错时会有更详细的错误信息。比如新手经常遇到的包找不到问题。
2)go get命令不允许使用GOROOT作为目标目录,即必须设置GOPATH且GOPATH不能和GOROOT指向同一个目录。

4、go test命令的改动

当启用profiling的时候,Go1.1不再默认删除go test产生的二进制文件,这样更利于分析profile文件。如:

go test -cpuprofile cpuprof.out mypackage

mypackage.test将被留在运行go test所在的目录。

go test命令还能够生成profiling信息反映goroutines在哪个地方堵塞了。这些信息会保存在一个bloking profile文件中,通过go test -blockprofile 指定。

5、go fix命令

该命令不再用来修复Go1之前的代码(将其升级到Go1 APIs),对于Go1之前的代码,应该先用Go1.0的工具链来修复。也就是说,Go1.1中,该命令没法将Go1之前的代码fix成Go1

三、性能的提升

Go1.1的性能提升一般在30%-40%,主要的改动如下:

1、大部分情况下,gc编译器可以生产更好的代码,尤其是32-bit Intel架构下的浮点型

2、gc编译器做了更多内联工作,包括一些运行时的操作,如append和interface转换

3、重新实现了map数据类型,很大程度减少map的内存占用和CPU时间

4、支持并行GC(garbage collector),缩短GC “Stop the World”的时间

5、GC(garbage collector)更精确,能够花更少的CPU时间但是能够明显的释放heap内存,尤其是在32-bit架构

6、将net poller 集成到了 runtime(network包和runtime紧密耦合),这样,网络操作时上下文切换会更少

四、标准库的改动

1、bufio包

增加了Scanner类型

2、net包

严格限制了网络名,如ResolveTCPAddr只能是”tcp”,”tcp4″和”tcp6″(Go1.0x中是可以任意字符串的);

ListenUnixgram返回类型由原来的UDPConn改为UnixConn,这样可以使用ReadFrom和WriteTo方法;

IPAddr、TCPAddr和UDPAddr增加了一个新字段:Zone。这样,原来类似这样的代码(net.TCPAddr{ip, port})得修改为:net.TCPAddr{IP: ip, Port: port})

3、reflect包

增加了Select函数(支持select语言)http://tip.golang.org/pkg/reflect/#Select

增加类型断言通过Value.Convert或Type.ConvertibleTo方法

新函数MakeFunc创建一个函数包装器,使得调用函数更简单(以存在的Values为参数),它会做Go中的标准类型转换,比如传递一个int类型到interface{}(当然是反射的方式)

增加了ChanOf、MapOf和SliceOf,方便从已存在的类型创建新的类型,如仅仅通过T创建[]T

4、time包

增加了一些新方法

5、标准库的其他一些小改动不一一细说了,用到时候查阅一下文档吧

五、升级现有代码

如果你的代码是Go1.0x写的,需要升级到Go1.1,这是很容易的事情。具体可以根据实际情况看看Introduction to Go 1.1中各个点的updating

另附 星星 翻译的完整版 Go 1.1 介绍

Go1.1要来了,期待一下吧。

13,146 浏览数

  6 条评论 到 “Go 1.1相关改动介绍”

评论 (6)
  1. 期待go1.1,希望在性能上能有长足的进步

  2. 1、整数除以0问题
    如果被除数是变量时为0还是会panic吧?

  3. 2、int/uint类型在64-bit平台实现为64bits
    这个在1.0.3也是这样吧?

  4. 终于发布啦

 评论

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>