1
0
mirror of https://github.com/chai2010/go2-book.git synced 2025-06-06 17:53:09 +00:00
This commit is contained in:
chai2010 2019-02-25 13:32:34 +08:00
parent f13f21d387
commit 0f99b391c6

View File

@ -2,7 +2,7 @@
因为Go1承诺Go1后序的版本都保持了向前兼容的目标。不过在从Go1发展到Go1.10的过程中语言依然是增加了一些新的特性。本节我们简单回顾Go1到Go1.10的变化。
## 1.2.1 Go1.2
## 1.2.1 Go1.22013年12月
Go1.2最大的语言变化是切片操作时可以设置新切片的容量。这个需求在Go1之前就被提出了但是因为Go1修改工作较大而延期到了Go1.2才被实现。
@ -26,24 +26,83 @@ func (v Value) Slice3(low, high, max int) Value
通过限制子切片的容量,可以将不同子切片进行安全的分割,避免子切片无意越界操作其它切片空间。
## 1.2.2 Go1.4
## 1.2.2 Go1.42014年12月
https://golang.org/doc/go1.4#language
Go1.4语言部分对`for`语法进行了加强。在Go1.3之前`for`只有下面两种写法:
```go
for i, v := range x {
// ...
}
for i := range x {
// ...
}
```
`for range`针对要循环变量类型的不同,产生的循环变量也有差异。在第一种写法中,如果要循环的是数组或切片类型则`i``v`分别表示索引的下表和元素的值如果循环的类型是map类型时则`i``v`分别表示键和值这种写法不能用户管道类型变量的迭代。而第二种循环也可以用管道变量的迭代直到管道被关闭时结束。如果用第二种方式循环遍历数组或map则和`for i, _ := range x {}`的写法相关相同,相当于忽略的要迭代的值。
但是有时候我们仅仅是要循环几次而并不关心循环变量的值在Go1.3之前可以这样写:
```go
var times [5][0]int
for i := 0; i < len(times); i++ {
// ...
}
for _ = range times {
// ...
}
```
前一种方式采用传统的`for`循环方式遍历,而后一种方式采用`for range`遍历,但是获取了每次遍历到的值。
在Go1.4中,后一种方式可以省略掉前面的垃圾桶变量,像这样写:
```go
var times [5][0]int
for range times {
// ...
}
```
其中`times`对应一个`[5][0]int`类型的数组,虽然第一维数组有长度,但是数组的元素`[0]int大小``0`,因此整个数组占用的内存大小依然是`0`。没有付出额外的内存代价,我们就通过`for range`方式实现了`times`次快速迭代。
## 1.2.3 Go1.5
## 1.2.4 Go1.72016年8月
https://golang.org/doc/go1.5#language
在Go1.3的时代2014年Go语言官方博客专门属文引入了`context`概念包,并稍后在`golang.org/x/net/context`提供了官方的实现。`context`包是Go语言官方对Go进行并发编程的实践成果用来简化对于处理单个请求的多个Goroutine之间与请求域的数据、超时和退出等操作。`context`包推出后就被社区快速吸收使用例如gRPC以及很多Web框架都通过`context`来控制Goroutine的生命周期。
## 1.2.4 Go1.7
在Go1.7发布时,作为扩展包的`golang.org/x/net/context`终于移到标准库中。Go语言官方博客已经有专文讲述了`context`包的使用,这里就不详细展开了。感兴趣的读者可以查看并发相关的文档和书籍。
https://golang.org/doc/go1.7#context
## 1.2.5 Go1.8
## 1.2.5 Go1.82017年2月
https://golang.org/doc/go1.8#language
Go1.8语言有一个小的变化,如果两个结构体成员名字和底层的类型相同(忽略成员的标签字符串差异),那么结构体底层对应相同的结构可以相互强制转型。
## 1.2.6 Go1.9
比如下面的代码:
```go
func main() {
type T1 struct {
X int `json:"foo"`
}
type T2 struct {
X int `json:"bar"`
}
var v1 = T1{X: 9527}
var v2 = T2(v1) // now legal
fmt.Println(v2)
}
```
`T1``T2`仅仅是成员标签字符串不同,但是底层结构是相同的,它们可以相互强制转型。
## 1.2.6 Go1.92017年8月
Go1.9终于引入了类型别名的特性。类型别名的特性如下: