[翻译]从 r60 到 Go 1

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//github.com/pmylund/helloworld 中出现。

由于这些新的约定,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 快照历史了解更多信息。

Comments

6 responses to “[翻译]从 r60 到 Go 1”

  1. Tony Avatar
    Tony

    呵呵,正想翻译这篇文章呢,就在这里看到了,好快呀,谢谢了

  2. joe yougy Avatar
    joe yougy

    楼主: “所有编译后的二进制文剑存储于 GOPATH/bin”

    文剑 是神马剑啊??? (⊙_⊙)?

  3. mikespook Avatar

    谢谢,已经更正。

  4. […] 首先,在$GOPATHsrc(如果不知道$GOPATH是什么,请移步这里看详细信息)下面新建一个文件夹“w32api”,然后在其内新建一个文件“kernel32.go”,内容如下。 […]

  5. hjs Avatar
    hjs

    谢谢!正疑惑,就看到您的解答!

  6. […] 首先,在$GOPATHsrc(如果不知道$GOPATH是什么,请移步这里看详细信息)下面新建一个文件夹“w32api”,然后在其内新建一个文件“kernel32.go”,内容如下。 […]

Leave a Reply

Your email address will not be published. Required fields are marked *