Go 1 之前的版本历史

此页面总结了 Go 1 之前 Go 的稳定版本之间的更改。有关最新版本的说明,请参阅版本历史页面。

r60(2011/09/07 发布)

r60 版本对应于weekly.2011-08-17。本部分重点介绍此版本中最重大的更改。有关更详细的摘要,请参阅每周版本说明。有关完整信息,请参阅Mercurial 更改列表

语言

现在要求“else”块使用大括号,除非“else”的主体是另一个“if”。由于 gofmt 始终将这些大括号放在任何位置,因此 gofmt 格式化的程序不会受到影响。要修复其他程序,请运行 gofmt。

包 http的 URL 解析和查询转义代码(例如 ParseURLURLEscape)已移至新的url 包,对名称进行了多项简化。可以使用 gofix 自动更新客户端代码。

图像包对诸如 image.RGBAimage.NRGBA 等结构类型的 Pix 字段进行了重大更改。image.Image 接口类型未更改,如果您没有明确引用 Pix 字段,则无需更改代码。例如,如果您使用 image/jpeg 包解码多个图像,使用 image/draw 组合它们,然后使用 image/png 编码结果,则您的代码仍应像以前一样工作。如果您的代码确实引用 Pix 字段,请参阅 weekly.2011-07-19 快照说明,了解如何更新您的代码。

模板包 已被一个新的模板包(以前称为 exp/template)替换。原始模板包仍可用作 old/templateold/template 包已弃用,并将被删除。Go 树已更新为使用新的模板包。我们鼓励旧模板包的用户切换到新模板包。使用 templateexp/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 来提供任意数据。

软件包 osErrorString 类型已被隐藏。大多数 os.ErrorString 用法都可以用 os.NewError 替换。

软件包 reflect 支持一个新的结构标记方案,它允许在多个软件包之间共享结构标记。在此方案中,标记必须采用以下形式

	`key:"value" key2:"value2"`

现在,StructField 类型的 Tag 字段具有类型 StructTag,它有一个 Get 方法。jsonxml 的客户端需要更新。表示

	type T struct {
		X int "name"
	}

的代码应变为

	type T struct {
		X int `json:"name"`  // or `xml:"name"`
	}

使用 govet 来识别需要更改为使用新语法的结构标记。

软件包 sortIntArray 类型已重命名为 IntSliceFloat64SliceStringSlice 也是如此。

软件包 stringsSplit 函数本身已拆分为 SplitSplitNSplitN 与旧的 Split 相同。新的 Split 等效于最终参数为 -1 的 SplitN

软件包 image/drawDraw 函数现在采用一个附加参数,即合成运算符。如有疑问,请使用 draw.Over

工具

Goinstall 现在从任意远程存储库(不仅仅是 Google Code、GitHub 等)安装软件包和命令。有关详细信息,请参阅 goinstall 文档

r58(2011/06/29 发布)

r58 版本对应于 weekly.2011-06-09,并进行了其他错误修复。本节重点介绍此版本中最重大的更改。有关更详细的摘要,请参阅 每周发行说明。有关完整信息,请参阅 Mercurial 变更列表

语言

此版本修复了 错误使用 goto 的程序中未初始化内存的使用

与往常一样,gofix 将处理这些更改对软件包 API 所需的大部分重写工作。

软件包 httpClient.Get 方法中删除了 finalURL 返回值。该值现在可通过 http.Response 上的新 Request 字段获得。类型 map[string][]string 的大多数实例都已替换为新的 Values 类型。

exec 包 已重新设计,具有更方便和简洁的 API。

strconv 包Quote 函数现在仅转义未被 unicode.IsPrint 归类为可打印的 Unicode 代码点。以前,Quote 会转义所有非 ASCII 字符。这也影响 fmt 包的 "%q" 格式化指令。以前的引用行为仍然可以通过 strconv 的新 QuoteToASCII 函数获得。

os/signal 包SignalUnixSignal 类型已移至 os 包。

image/draw 包exp/draw 的新名称。exp/draw 中与 GUI 相关的代码现在位于 exp/gui 包中。

工具

Goinstall 现在观察 GOPATH 环境变量以构建和安装 Go 树之外的您自己的代码和外部库(并避免编写 Makefiles)。

次要修订

r58.1 添加了 buildruntime 更改,以使 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 现在将对实现 GobEncoderGobDecoder 接口的类型的值进行编码和解码。这允许具有未导出字段的类型传输自洽的描述;示例包括 big.Intbig.Rat

包 http 已重新设计。对于客户端,有新的 ClientTransport 抽象,它们可以更细致地控制 HTTP 详细信息,例如发送的标头和遵循的重定向。这些抽象使实现添加功能(例如 OAuth2)的自定义客户端变得容易。对于服务器,ResponseWriter 已删除其非必需方法。不再需要 Hijack 和 Flush 方法;代码可以通过检查特定值是否实现 HijackerFlusher 来测试它们。RemoteAddr 和 UsingTLS 方法被 Request 的 RemoteAddr 和 TLS 字段取代。SetHeader 方法被 Header 方法取代;它的结果(类型为 Header)实现 Set 和其他方法。

包 netDial 中删除了 laddr 参数,并从 LookupHost 中删除了 cname 返回值。现在,该实现使用 cgo 在可能的情况下使用 C 库 getaddrinfo(3) 函数来实现网络名称查找。这确保了 Go 和 C 程序以相同的方式解析名称,并且还避免了 OS X 应用程序级防火墙。

包 os 引入了简化的 OpenCreate 函数。原始 Open 现在可用作 OpenFileStartProcess 的最后三个参数已被替换为指向 ProcAttr 的指针。

包 reflect 已重新设计。 Type 现在是一个实现了所有可能类型方法的接口。不要对 Type t 进行类型转换,而要对 t.Kind() 进行转换。 Value 现在是一个实现了所有可能值方法的结构值。不要对 Value v 进行类型转换,而要对 v.Kind() 进行转换。 Typeof 和 NewValue 现在分别称为 TypeOfValueOf。要创建可写 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 开始,因为在此版本之前,我们现在认为的每周快照被称为版本。