Go1 发布的日子越来越近,Golang 社区就像将开了的山泉水一样,泊泊的不断传来各种关于 Go1 的声音。
这篇文章总结得比较完整,很清晰,随即翻译于此。
原文:http://gophersays.com/from-r60-to-go1/
—————-翻译分割线—————-
Go 1 已经到门口了,伙计们,它有许多变化!
这里是关于你必须知道的一些重要事情:
Go 命令
新的 map delete 语法
Error 有了自己的包
重写的库
新的库
Go 命令
Go 有了新的主命令,go,用于替换其他所有旧的 go 命令:
以前 | 现在 |
---|---|
godoc |
go doc |
gofix |
go fix |
gofmt -l -w *.go |
go fmt |
goinstall |
go get |
gorun |
go run |
gotest |
go test |
govet |
go vet |
make |
go build |
make clean |
go clean |
make install |
go install |
(大多数工具命令,包括 6g/8g、6l/8l、6cov/8cov、gotype、gopprof 和 6prof/8prof 现在是 go tool。参阅 go tool 查看完整列表。)
别了,Makefiles
Go 1 已经摒弃了 Makefiles,不管怎么说这总是个临时的解决方案。作为替代,所有的事情——包括如何获取包;如何编译;以及如何测试——都将由源代码来直接导出,这全部都是由一个环境变量控制,GOPATH。
为了让 Go 1 能够编译某个包,该包必须包含在 GOPATH 的路径列表中。(如果 GOPATH 没有设置,go 使用自己的目录代替。)
- 所有编译后的二进制
文剑(thx joe yougy)文件存储于 GOPATH/bin - 所有编译后的包存储于 GOPATH/pkg//
- 所有源代码存储于 GOPATH/src/
这意味着如果有一个包 github.com/pmylund/helloworld,源代码应当保存于列出在 GOPATH 中的目录 src/github.com/pmylund/helloworld 下。当执行 go install,编译后的包会在这个 GOPATH 目录下的 pkg/
由于这些新的约定,Go 唯一需要的配置就是 GOPATH。没有 Makefile,没有自定义脚本,也不用担心命名冲突。
这里有个用在构建和执行自有项目的例子,也可以避免外部代码搞乱项目的目录。(例如使用 go get):
在 ~/.bash_aliases (或 ~/.bash_rc)中:
mygo=/home/patrick/projects/go goroot=/home/patrick/apps/go gobin=$goroot/bin:$mygo/bin export GOPATH=$goroot:$mygo export PATH=$PATH:$gobin
因为 Go 所在目录是 GOPATH 中列出的第一个文件夹,这将作为如 go get 命令使用的默认目标目录——除非你的项目已经重新设定了其他目录,否则这将作为你项目编译后的 bin 和 pkg 目录存放的地方。
(如果你没有 Go 目录的写权限,可以指定另一个作为默认目录来代替 goroot。go 会将所有新的第三方包安装到那里。)
(当你构建一个会导入某个包的项目时,例如 github.com/pmylund/helloworld,Go 会在 GOPATH 中列出的所有目录里查找。)
为了了解其背后的原理,可以参考 Russ Cox 发表在 golang-nuts 邮件列表上的叫做 The Go Command 的消息。
新的 map delete 语法
现在可以使用 delete(map, “key”) 来代替 map[“key”] = nil, false。
Error 有了自己的包
Error 从 os 移到了 errors。同样,error 现在是一个内建类型,因此无需导入任何东西就可以使用它。
以前 | 现在 |
---|---|
os.Error |
error |
os.NewError(text string) os.Error |
errors.New(text string) error |
err.String() string |
err.Error() string |
重构的库
下面的表格列出了新旧包的导入路径。(所有这些都可以用 go fix 自动修复。)
重写的库
包 | 变化 |
---|---|
strconv |
明显的重构 |
template |
用拥有全新 API 的 text/template 替换 |
time |
完全重新设计 |
url |
移动到 net/url 并做了 若干修改,最明显的是 url.URL 中的 URL.Raw 已经移除,并且应当用 URL.String() 作为代替 |
新的库
包 | 描述 |
---|---|
database/sql |
用于操作关系数据库的标准接口(已经存在的驱动有 SQLite、MySQL、PostgreSQL 等等) |
html/template |
text/template 的一个 XSS-safe 封装 |
这并未涵盖 Go 1 中所有的语言和包的变化。请参阅 Go 1 发布说明(仍在进行中)和 weekly 快照历史了解更多信息。
Leave a Reply