原文连接:Go 语言的 4 个特性改动golang
在 Go1.1 能够看到某个版本的 Go 语言一些改动文档(修改 URL 参数查看别的版本)。json
其中以 Go1.1#language 标签下关于语言特性方面的尤其重要。数组
在每一个 Go 语言新版本发布后浏览一下,是个良好的习惯。markdown
下面我会从 Go1.1 到 Go1.11 以来挑 4 个值得讨论的改动来跟你们分享一下。oop
版本: Go1.2post
在现有数组或切片下,使用第二个冒号来指示新生成的切片的容量。spa
func TestThreeIndex(t *testing.T) { s := [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} s1 := s[2:4] // 等价于 s[2:4:cap(s)],省略取 cap(s)。 t.Log(s1) // [2, 3] t.Log(len(s1), cap(s1)) // len = 2, cap = 8 // 能够访问在 cap 之内的元素而且若是访问在 len 和 cap 之间的元素就能够访问到底层数组。 t.Log(s1[0:7]) // [2, 3, 4, 5, 6, 7, 8, 9] // 经过限制 cap 从而限制新的切片访问底层数组的能力。 // cap 取值必须小于或等于底层数组 cap。 s2 := s[2:4:7] // cap = 7 - 2 = 5 t.Log(s2) // [2, 3] t.Log(len(s2), cap(s2)) // len = 2, cap = 5 t.Log(s2[0:5]) // [2, 3, 4, 5, 6] // error: slice bounds out of range // 越界 t.Log(s2[0:7]) } 复制代码
版本:Go1.4设计
for range 不须要索引和索引对应的元素值的简便写法。code
for _, v := range s { t.Log(v) } 复制代码
for i := range s { t.Log(i) } 复制代码
for range s { ... } 复制代码
版本:Go1.8orm
结构体类型转换时,标签会被忽略。也就是说,标签不一样的结构体之间也能够互相转换类型。
注意:正常状况下(没有标签)的结构体类型之间的转换只有字段名、类型和声明的顺序所有相同才合法。
type T1 struct { X int `json:"foo"` } type T2 struct { X int `json:"bar"` } var v1 T1 var v2 T2 v1 = T1(v2) // 如今是合法的 复制代码
版本:Go1.9
类型别名:T1 彻底是 T2 这个类型,这个新设计是为了重构和兼容旧代码。
type T1 = T2 复制代码
类型声明:T1 的底层数据类型是 T1。
type T1 T2 复制代码
一个简单的区别就是:类型声明和底层类型赋值时须要转换,而类型别名不须要。