Go 1 发布前的历史记录
本页面总结了 Go 1 之前 Go 稳定版本之间的更改。有关最新版本的说明,请参阅发布历史页面。
r60(发布于 2011/09/07)
r60 版本对应于 weekly.2011-08-17
。本节重点介绍此版本中最重大的更改。有关更详细的摘要,请参阅每周发布说明。有关完整信息,请参阅Mercurial 更改列表。
语言
现在,除非“else”块的主体是另一个“if”,否则“else”块必须有大括号。由于 gofmt 无论如何都会添加这些大括号,因此 gofmt 格式化的程序不会受到影响。要修复其他程序,请运行 gofmt。
软件包
http 包的 URL 解析和查询转义代码(例如 ParseURL
和 URLEscape
)已移至新的url 包,并对名称进行了一些简化。客户端代码可以使用 gofix 自动更新。
image 包中 image.RGBA 和 image.NRGBA 等结构类型的 Pix
字段已发生重大更改。但是,image.Image 接口类型没有更改,如果您没有明确引用 Pix
字段,则无需更改代码。例如,如果您使用 image/jpeg 包解码多个图像,使用 image/draw 组合它们,然后使用 image/png 编码结果,那么您的代码应该仍然像以前一样工作。如果您的代码确实引用了 Pix
字段,请参阅weekly.2011-07-19 快照说明,了解如何更新代码。
template 包已替换为新的模板包(以前是 exp/template
)。原始的 template 包仍然作为 old/template 提供。old/template
包已被弃用并将被删除。Go 树已更新为使用新的 template 包。我们鼓励 old template 包的用户切换到新的 template 包。使用 template
或 exp/template
的代码需要将其导入行分别更改为 "old/template"
或 "template"
。
工具
Goinstall 现在使用新的标签选择方案。在下载或更新时,goinstall 会查找带有 "go."
前缀且与本地 Go 版本对应的标签或分支。对于 Go release.r58
,它查找 go.r58
。对于 weekly.2011-06-03
,它查找 go.weekly.2011-06-03
。如果未找到特定的 go.X
标签或分支,它会选择最近的早期版本。如果找到合适的标签或分支,goinstall 会使用该版本的代码。否则,它会使用版本控制系统选择的默认版本。鼓励库作者在其存储库中使用适当的标签或分支名称,以使他们的库更易于访问。
次要修订
r60.1 包含一个链接器修复、一对goplay修复、一个 json
包修复和一个新的结构体标签选项。
r60.2 修复了一个涉及 map 的内存泄漏。
r60.3 修复了一个反射错误。
r59(发布于 2011/08/01)
r59 版本对应于 weekly.2011-07-07
。本节重点介绍此版本中最重大的更改。有关更详细的摘要,请参阅每周发布说明。有关完整信息,请参阅Mercurial 更改列表。
语言
此版本包含一项语言更改,限制了 goto
的使用。本质上,块外的 goto
语句不能跳转到块内的标签。如果您的代码使用了 goto
,可能需要进行更改。请参阅此变更集,了解新规则对 Go 树的影响。
软件包
像往常一样,gofix 将处理这些包 API 更改所需的大部分重写。
http 包有一个新的 FileSystem 接口,提供文件访问。现在 FileServer 辅助函数接受一个 FileSystem
参数,而不是显式的文件系统根目录。通过实现您自己的 FileSystem
,您可以使用 FileServer
来提供任意数据。
os 包的 ErrorString
类型已被隐藏。os.ErrorString
的大多数用法都可以替换为 os.NewError。
reflect 包支持一种新的结构体标签方案,该方案允许在多个包之间共享结构体标签。在此方案中,标签必须采用以下形式
`key:"value" key2:"value2"`
StructField 类型的 Tag 字段现在具有 StructTag 类型,它有一个 Get
方法。 json 和 xml 的客户端需要更新。代码中的
type T struct { X int "name" }
应变为
type T struct { X int `json:"name"` // or `xml:"name"` }
使用 govet 来识别需要更改以使用新语法的结构体标签。
sort 包的 IntArray
类型已重命名为 IntSlice,Float64Slice 和 StringSlice 也类似。
strings 包的 Split
函数已拆分为 Split 和 SplitN。SplitN
与旧的 Split
相同。新的 Split
等效于最终参数为 -1 的 SplitN
。
工具
Goinstall 现在可以从任意远程仓库(不仅仅是 Google Code、GitHub 等)安装包和命令。有关详细信息,请参阅 goinstall 文档。
r58(发布于 2011/06/29)
r58 版本对应于 weekly.2011-06-09
并附加了错误修复。本节重点介绍此版本中最重大的更改。有关更详细的摘要,请参阅每周发布说明。有关完整信息,请参阅Mercurial 更改列表。
语言
此版本修复了滥用 goto
的程序中未初始化内存的使用。
软件包
像往常一样,gofix 将处理这些包 API 更改所需的大部分重写。
http 包从 Client.Get 方法中删除了 finalURL
返回值。该值现在可通过 http.Response 上的新 Request
字段获取。类型 map[string][]string 的大多数实例已替换为新的 Values 类型。
exec 包已重新设计,具有更方便简洁的 API。
strconv 包的 Quote 函数现在只转义那些不被 unicode.IsPrint 分类为可打印的 Unicode 码点。以前 Quote 会转义所有非 ASCII 字符。这也影响 fmt 包的 "%q"
格式化指令。以前的引用行为仍然可通过 strconv 的新 QuoteToASCII 函数获得。
os/signal 包的 Signal 和 UnixSignal 类型已移至 os 包。
image/draw 包是 exp/draw
的新名称。exp/draw
中与 GUI 相关的代码现在位于 exp/gui 包中。
工具
Goinstall 现在遵循 GOPATH 环境变量,以便在 Go 树之外构建和安装您自己的代码和外部库(并避免编写 Makefiles)。
次要修订
r58.1 增加了构建和运行时更改,以使 Go 在 OS X 10.7 Lion 上运行。
r57(发布于 2011/05/03)
r57 版本对应于 weekly.2011-04-27
并附加了错误修复。本节重点介绍此版本中最重大的更改。有关更详细的摘要,请参阅每周发布说明。有关完整信息,请参阅Mercurial 更改列表。
新的 gofix 工具查找使用旧 API 的 Go 程序,并将其重写为使用新 API。更新到新的 Go 版本后,gofix 有助于对您的程序进行必要的更改。Gofix 将处理下面描述的 http、os 和 syscall 包更改,我们将更新程序以跟上未来库的更改。Gofix 无法完美处理所有情况,因此在提交更改之前请阅读并测试它所做的更改。有关更多信息,请参阅gofix 博客文章。
语言
多重赋值语法取代了 closed
函数。通道接收的语法允许一个可选的第二个赋值值,一个布尔值,指示通道是否已关闭。此代码
v := <-ch if closed(ch) { // channel is closed }
现在应写成
v, ok := <-ch if !ok { // channel is closed }
未使用的标签现在是非法的,就像未使用的局部变量一样。
软件包
gob 包现在将编码和解码实现 GobEncoder 和 GobDecoder 接口的类型的值。这允许具有未导出字段的类型传输自洽描述;示例包括 big.Int 和 big.Rat。
http 包已重新设计。对于客户端,有新的 Client 和 Transport 抽象,可以更好地控制 HTTP 细节,例如发送的标头和遵循的重定向。这些抽象使得实现添加 OAuth2 等功能的自定义客户端变得容易。对于服务器,ResponseWriter 已删除了其非必要方法。Hijack 和 Flush 方法不再是必需的;代码可以通过检查特定值是否实现了 Hijacker 或 Flusher 来测试它们。RemoteAddr 和 UsingTLS 方法被 Request 的 RemoteAddr 和 TLS 字段替换。SetHeader 方法被 Header 方法替换;其结果,类型为 Header,实现了 Set 和其他方法。
net 包删除了 Dial 中的 laddr
参数,并删除了 LookupHost 中的 cname
返回值。现在,在可能的情况下,实现使用 cgo 来使用 C 库 getaddrinfo(3) 函数实现网络名称查找。这确保 Go 和 C 程序以相同的方式解析名称,并避免了 OS X 应用程序级防火墙。
os 包引入了简化的 Open 和 Create 函数。原始的 Open 现在作为 OpenFile 提供。StartProcess 的最后三个参数已替换为指向 ProcAttr 的指针。
reflect 包已重新设计。Type 现在是一个接口,实现了所有可能的类型方法。现在不是对 Type t
进行类型 switch,而是对 t.Kind()
进行 switch。Value 现在是一个结构体值,实现了所有可能的值方法。现在不是对 Value v
进行类型 switch,而是对 v.Kind()
进行 switch。Typeof 和 NewValue 现在分别称为 TypeOf 和 ValueOf。要创建可写的 Value,请使用 New(t).Elem()
而不是 Zero(t)
。有关完整详细信息,请参阅更改说明。新的 API 允许更高效地实现 Value,避免了以前 API 所需的许多分配。
请记住,gofix 将处理这些包 API 更改所需的大部分重写。
工具
新的命令 Gofix 已在上面描述。
Gotest 现在是一个 Go 程序,而不是 shell 脚本。新的 -test.short
标志与包 testing 的 Short 函数结合使用,允许您编写可以在正常或“短”模式下运行的测试;all.bash 以短模式运行测试以减少安装时间。Makefiles 知道该标志:使用 make testshort
。
运行时支持现在实现了 CPU 和内存分析。Gotest 的新 -test.cpuprofile
和 -test.memprofile
标志使得分析测试变得容易。要为您的 Web 服务器添加分析功能,请参阅 http/pprof 文档。对于其他用途,请参阅 runtime/pprof 文档。
次要修订
r57.1 修复了 http.FormFile 中的 nil 指针解引用。
r57.2 修复了 滥用 goto
的程序中未初始化内存的使用。
r56(发布于 2011/03/16)
r56 版本是第一个稳定版本,对应于 weekly.2011-03-07.1
。编号从 56 开始,因为在此版本之前,我们现在认为是每周快照的被称为版本。