Go 1 之前的发布历史
本页面总结了 Go 1 之前各稳定版本之间的变更。 有关最近版本的说明,请参阅 发布历史 页面。
r60(发布于 2011年9月7日)
r60 版本对应
weekly.2011-08-17。
本节重点介绍此版本中最显著的变更。
更详细的摘要请参阅
每周发布说明。
完整信息请查阅
Mercurial 变更列表。
语言
现在要求“else”代码块必须带有花括号,除非“else”的主体是另一个“if”。由于 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 包。
我们鼓励原 template 包的用户转而使用新包。
使用 template 或 exp/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 来提供任意数据。
包 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"` // 或 `xml:"name"`
}
可以使用 govet 来识别需要更改为新语法的结构体标签。
sort 包 的 IntArray 类型已被重命名为 IntSlice,同样地,还有 Float64Slice 和 StringSlice。
strings 包 的 Split 函数本身已被拆分为 Split 和 SplitN。
SplitN 与旧的 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 包 的 Signal 和 UnixSignal 类型已被移至 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 包现在可以编码和解码实现了 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 现在是一个接口,实现了
所有可能的类型方法。
取代了对类型 t 进行类型 switch,现在应对 t.Kind() 进行 switch。
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 在短模式下运行测试以减少安装时间。
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 开始,是因为在此版本之前,
我们现在认为的每周快照被称为发布版。