Go 1 之前的发布历史

本页面总结了 Go 1 之前各稳定版本之间的变更。 有关最近版本的说明,请参阅 发布历史 页面。

r60(发布于 2011年9月7日)

r60 版本对应 weekly.2011-08-17。 本节重点介绍此版本中最显著的变更。 更详细的摘要请参阅 每周发布说明。 完整信息请查阅 Mercurial 变更列表

语言

现在要求“else”代码块必须带有花括号,除非“else”的主体是另一个“if”。由于 gofmt 总是会自动添加这些花括号,因此经 gofmt 格式化的程序不受影响。 要修复其他程序,请运行 gofmt。

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

包 imageimage.RGBAimage.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 包。 我们鼓励原 template 包的用户转而使用新包。 使用 templateexp/template 的代码需要将其 import 行分别更改为 "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 修复了一个 反射 bug

r59(发布于 2011年8月1日)

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"`  // 或 `xml:"name"`
	}

可以使用 govet 来识别需要更改为新语法的结构体标签。

sort 包IntArray 类型已被重命名为 IntSlice,同样地,还有 Float64SliceStringSlice

strings 包Split 函数本身已被拆分为 SplitSplitNSplitN 与旧的 Split 功能相同。 新的 Split 等同于将最后一个参数设为 -1 的 SplitN

image/draw 包Draw 函数现在新增了一个参数:一个合成运算符。如有疑问,请使用 draw.Over

工具

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 包SignalUnixSignal 类型已被移至 os 包。

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

工具

Goinstall 现在会观察 GOPATH 环境变量,以在 Go 源代码树外部构建和安装您自己的代码及外部库(从而避免编写 Makefile)。

小版本修订

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 函数。channel(通道)接收操作的语法允许一个可选的第二赋值,一个布尔值,指示通道是否已关闭。原来的代码:

	v := <-ch
	if closed(ch) {
		// 通道已关闭
	}

现在应该写为:

	v, ok := <-ch
	if !ok {
		// 通道已关闭
	}

未使用的标签现在是非法的,就像未使用的局部变量一样。

gob 包现在可以编码和解码实现了 GobEncoderGobDecoder 接口的类型的值。这允许具有未导出字段的类型传输自描述信息;示例包括 big.Intbig.Rat

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

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

os 包 引入了简化的 OpenCreate 函数。 原来的 Open 现在可通过 OpenFile 访问。 StartProcess 的最后三个参数 已被一个指向 ProcAttr 的指针取代。

reflect 包已被重新设计。 Type 现在是一个接口,实现了 所有可能的类型方法。 取代了对类型 t 进行类型 switch,现在应对 t.Kind() 进行 switch。 Value 现在是一个结构体值,实现了 所有可能的值方法。 取代了对值 v 进行类型 switch,现在应对 v.Kind() 进行 switch。 Typeof 和 NewValue 现在被称为 TypeOfValueOf。 要创建可写的 Value,请使用 New(t).Elem() 代替 Zero(t)。 详见 变更描述 了解完整细节。 新的 API 允许更高效地实现 Value, 避免了旧 API 所需的许多分配操作。

请记住,gofix 将处理这些包 API 更改所需的大部分重写工作。

工具

Gofix,一个新命令,上文已描述。

Gotest 现在是一个 Go 程序,而不是 shell 脚本。 新的 -test.short 标志与 testing 包的 Short 函数结合, 允许你编写可以在普通模式或“短”模式下运行的测试; all.bash 在短模式下运行测试以减少安装时间。 Makefile 知道这个标志:使用 make testshort

运行时支持现在实现了 CPU 和内存性能分析。 Gotest 新增的 -test.cpuprofile-test.memprofile 标志使得 对测试进行性能分析变得容易。 要将性能分析添加到你的 Web 服务器,请参阅 http/pprof 文档。 对于其他用途,请参阅 runtime/pprof 文档。

次要修订

r57.1 修复了 http.FormFile 中的空指针解引用问题。

r57.2 修复了 在误用 goto 的程序中使用未初始化内存的问题。

r56 (发布于 2011/03/16)

r56 版本是第一个稳定版本,对应于 weekly.2011-03-07.1。 版本号从 56 开始,是因为在此版本之前, 我们现在认为的每周快照被称为发布版。