02.09 Go 語言 2020 年的狀態:回顧 Go1.12 以來的變化

本文整理自 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個數字一組),也可以用來分隔前綴與第一個數字。

舉例:

<code>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/<code>

Go 1.13中關於語言規範方面的另一個變動點是取消了移位操作(>>的<,以前必須的強制到uint的轉換現在不必要了:

<code>var i int = 5

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

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

以下代碼在 Go1.14 之前是不允許的,因為 Close 方法重複了。

<code>type ReadWriteCloser interface {
io.ReadCloser
io.WriteCloser
}/<code>

Go1.14 開始相同簽名(注意,要求籤名相同)的方法的不同接口可以內嵌在一個接口中。所以上面的代碼在 Go1.14 是允許的。但以下代碼 Go1.14 依然不允許,因為兩個 Close 的簽名不同。

<code>type MyCloser interface{
Close()
}

type ReadWriteCloser interface {

io.ReadCloser
MyCloser
}/<code>

標準庫的變化(重要的變化)

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 值

比如:

<code>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/<code>

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 選項,就不會出現完整路徑。

Go 語言 2020 年的狀態:回顧 Go1.12 以來的變化

Runtime

1、越界錯誤提示更友好

比如如下問題代碼:

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

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 的性能:

Go 語言 2020 年的狀態:回顧 Go1.12 以來的變化

JSON 的性能:

Go 語言 2020 年的狀態:回顧 Go1.12 以來的變化

社區

1、tinygo 現在屬於 Google 的一個項目

2、Go 開發者網絡

這張圖不知道怎麼來的,很明顯,中國的情況不符合啊。

Go 語言 2020 年的狀態:回顧 Go1.12 以來的變化

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

全球都有各種 Go 語言會議。

總結

該 PPT 還包括了其他一些信息,這裡沒有一一列出,有興趣的可以去瀏覽下。


分享到:


相關文章: