Go 1 之前的版本历史
此页面总结了 Go 1 之前 Go 的稳定版本之间的更改。有关最新版本的说明,请参阅版本历史页面。
r60(2011/09/07 发布)
r60 版本对应于weekly.2011-08-17
。本部分重点介绍此版本中最重大的更改。有关更详细的摘要,请参阅每周版本说明。有关完整信息,请参阅Mercurial 更改列表。
语言
现在要求“else”块使用大括号,除非“else”的主体是另一个“if”。由于 gofmt 始终将这些大括号放在任何位置,因此 gofmt 格式化的程序不会受到影响。要修复其他程序,请运行 gofmt。
包
包 http的 URL 解析和查询转义代码(例如 ParseURL
和 URLEscape
)已移至新的url 包,对名称进行了多项简化。可以使用 gofix 自动更新客户端代码。
图像包对诸如 image.RGBA 和 image.NRGBA 等结构类型的 Pix
字段进行了重大更改。image.Image 接口类型未更改,如果您没有明确引用 Pix
字段,则无需更改代码。例如,如果您使用 image/jpeg 包解码多个图像,使用 image/draw 组合它们,然后使用 image/png 编码结果,则您的代码仍应像以前一样工作。如果您的代码确实引用 Pix
字段,请参阅 weekly.2011-07-19 快照说明,了解如何更新您的代码。
模板包 已被一个新的模板包(以前称为 exp/template
)替换。原始模板包仍可用作 old/template。old/template 包已弃用,并将被删除。Go 树已更新为使用新的模板包。我们鼓励旧模板包的用户切换到新模板包。使用 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 修复 涉及映射的内存泄漏。
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 添加了 build 和 runtime 更改,以使 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
进行类型转换,而要对 t.Kind()
进行转换。 Value 现在是一个实现了所有可能值方法的结构值。不要对 Value v
进行类型转换,而要对 v.Kind()
进行转换。 Typeof 和 NewValue 现在分别称为 TypeOf 和 ValueOf。要创建可写 Value,请使用 New(t).Elem()
而不是 Zero(t)
。有关完整详细信息,请参见 更改说明。新的 API 允许对 Value 进行更有效的实现,从而避免了以前 API 所需的大量分配。
请记住,gofix 将处理为这些更改对包 API 所做的必要的大部分重写。
工具
Gofix,一个新命令,如上所述。
Gotest 现在是一个 Go 程序,而不是一个 shell 脚本。新的 -test.short
标志与包测试的 Short 函数结合使用,可让你编写可以在正常或“短”模式下运行的测试;all.bash 以短模式运行测试以减少安装时间。Makefile 了解此标志:使用 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 开始,因为在此版本之前,我们现在认为的每周快照被称为版本。