mirror of
https://github.com/chai2010/go2-book.git
synced 2025-06-06 17:53:09 +00:00
zz
This commit is contained in:
parent
f13f21d387
commit
0f99b391c6
79
ch1/ch1-2.md
79
ch1/ch1-2.md
@ -2,7 +2,7 @@
|
||||
|
||||
因为Go1承诺,Go1后序的版本都保持了向前兼容的目标。不过在从Go1发展到Go1.10的过程中,语言依然是增加了一些新的特性。本节我们简单回顾Go1到Go1.10的变化。
|
||||
|
||||
## 1.2.1 Go1.2
|
||||
## 1.2.1 Go1.2(2013年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.4(2014年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.7(2016年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.8(2017年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.9(2017年8月)
|
||||
|
||||
Go1.9终于引入了类型别名的特性。类型别名的特性如下:
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user