27

Go 语言 2020 年的状态:回顾 Go1.12 以来的变化

 4 years ago
source link: http://blog.studygolang.com/2020/02/state-of-go-2020/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本文整理自 Slide:https://speakerdeck.com/campoy/the-state-of-go-2020 ,分析 Go1.13 和 Go1.14 的新特性。主要包括如下内容:

  • 语言层面的变化
  • 标准库的变化
  • 工具的变化
  • 社区的情况

语言层面的变化

1、新的数字字面量(Go1.13)

主要包括:

  • 增加二进制数字字面量,以0b或0B开头
  • 在保留以”0″开头的八进制数字字面量形式的同时,增加以”0o”或”0O”开头的八进制数字字面量形式
  • 增加十六进制形式的浮点数字面量,以0x或0X开头的、形式如0x123.86p+2的浮点数
  • 为提升可读性,在数字字面量中增加数字分隔符”_”,分隔符可以用来分隔数字(起到分组提高可读性作用,比如每3个数字一组),也可以用来分隔前缀与第一个数字。

举例:

a := 5_3_7
b := 0o700
b1 := 0O700
b2 := 0_700
b3 := 0o_700
c := 0b111
c1 := 0B111
c2 := 0b_111
f1 := 0x10.24p+3
f2 := 0x1.Fp+0
f3 := 0x31_415.p-4

Go 1.13中关于语言规范方面的另一个变动点是 取消了移位操作(>>的<<)的右操作数仅能是无符号数的限制 ,以前必须的强制到uint的转换现在不必要了:

var i int = 5

fmt.Println(2 << uint(i)) // before go 1.13
fmt.Println(2 << i)       // in go 1.13 and later version

2、允许嵌入具有重叠方法集的接口(Go1.14)

以下代码在 Go1.14 之前是不允许的,因为 Close 方法重复了。

type ReadWriteCloser interface {
  io.ReadCloser
  io.WriteCloser
}

Go1.14 开始相同签名(注意,要求签名相同)的方法的不同接口可以内嵌在一个接口中。所以上面的代码在 Go1.14 是允许的。但以下代码 Go1.14 依然不允许,因为两个 Close 的签名不同。

type MyCloser interface{
  Close()
}

type ReadWriteCloser interface {
  io.ReadCloser
  MyCloser
}

标准库的变化(重要的变化)

1、删除对 SSLv3 的支持(Go1.14)

2、错误处理(Go1.13)

主要增加了 Unwrap、Is 和 As,以及 %w 包装错误。详见: 官方博文:Go 1.13中的错误处理

3、os.UserConfigDir() (string, error)(Go1.13)

用户系统的配置路径,如 Linux 下是:$HOME/.config

4、hash/maphash(Go1.14)

这个新包提供了字节序列上的哈希函数。这些哈希函数旨在用于实现哈希表或其他数据结构,这些哈希表或其他数据结构需要将任意字符串或字节序列映射为整数的均匀分布。这些哈希函数具有抗冲突性,但不是加密安全的。

5、reflect.IsZero() (Go1.13)判断是否是 0 值

比如:

reflect.ValueOf(0).IsZero() // true
reflect.ValueOf("").IsZero() // true
reflect.ValueOf(struct{}{}).IsZero() // true

reflect.ValueOf([]string{}).IsZero() // false
reflect.ValueOf([]string{nil}).IsZero() // true

6、testing 包的 T、B 和 TB 都加上了 CleanUp 方法(Go1.14)

这对并行测试和子测试有用。 CleanUp(f fun()) 在测试和子测试都完成时回调,后进先出的方式执行 f(如果注册多个)。

7、time 包的 Duration 增加了两个方法(Go1.13)

分别是 Milliseconds 和 Microseconds。

工具的变化

1、Go Modules(Go1.13)

这个不多说,Go1.13 发布时,有很多相关文章。比如: 干货满满的 Go Modules 和 goproxy.cn

2、go build 增加 -trimpath 选项(Go1.13)

panic 时,文件完整路径会出现,加上 -trimpath 选项,就不会出现完整路径。

IryQf22.png!web

Runtime

1、越界错误提示更友好

比如如下问题代码:

a := []int{1, 2, 3}
fmt.Println(a[3])

Go1.12 和之前是:

 panic: runtime error: index out of range 

从 Go1.13 开始变成:

 panic: runtime error: index out of range [3] with length 3 

2、性能提升:defer、JSON

defer 的性能:

ZNnUV3b.png!web

JSON 的性能:

uA7JVz3.png!web

社区

1、tinygo 现在属于 Google 的一个项目

2、Go 开发者网络

这张图不知道怎么来的,很明显,中国的情况不符合啊。

UrUz2qu.png!web

3、2020 年 6 月 22 日 ~ 25 日举行 GopherCon

全球都有各种 Go 语言会议。

总结

该 PPT 还包括了其他一些信息,这里没有一一列出,有兴趣的可以去浏览下。

欢迎关注我的公众号:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK