原文連接:Go 語言的 4 個特性改動golang
在 Go1.1 能夠看到某個版本的 Go 語言一些改動文檔(修改 URL 參數查看別的版本)。json
其中以 Go1.1#language 標籤下關於語言特性方面的尤其重要。數組
在每一個 Go 語言新版本發佈後瀏覽一下,是個良好的習慣。post
下面我會從 Go1.1 到 Go1.11 以來挑 4 個值得討論的改動來跟你們分享一下。ui
版本: Go1.2spa
在現有數組或切片下,使用第二個冒號來指示新生成的切片的容量。設計
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.4code
for range 不須要索引和索引對應的元素值的簡便寫法。cdn
for _, v := range s {
t.Log(v)
}
複製代碼
for i := range s {
t.Log(i)
}
複製代碼
for range s {
...
}
複製代碼
版本:Go1.8blog
結構體類型轉換時,標籤會被忽略。也就是說,標籤不一樣的結構體之間也能夠互相轉換類型。
注意:正常狀況下(沒有標籤)的結構體類型之間的轉換隻有字段名、類型和聲明的順序所有相同才合法。
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
複製代碼
一個簡單的區別就是:類型聲明和底層類型賦值時須要轉換,而類型別名不須要。