Go1-20 新特性:切片轉數組
你好,我是小四,你情商高,也可以叫我四哥~
Go1.20 正式版本還沒有發佈,官方計劃 2023 年 2 月份發佈。不過,Go1.20rc 已經在 12 月 8 號發佈了,一起來嚐鮮。
語言特性方面主要有四個優化,其中最主要的添加了 切片轉數組 功能。
其實在 Go1.17 版本,Go 語言已經有 切片轉數組指針 的功能。可以看 P 神的這篇文章 [1],瞭解下詳情。
引入 切片轉數組指針 特性之後,bradfitz 在改造標準庫時就有了下面這次更改 [2]:
但是在代碼 review 時,他發現這樣寫有點 “醜”,需要先取得數組指針再解引用,然後返回數組。
所以他就想能不能直接通過切片取得數組,而不是數組指針。後面就有了這個提案 [3]:切片轉數組。
目前這個提案已經加入到 Go1.20 版本里,官方文檔已經更新,如下:
下面是官方給出的例子:
s := make([]byte, 2, 4)
a0 := [0]byte(s)
a1 := [1]byte(s[1:]) // a1[0] == s[1]
a2 := [2]byte(s) // a2[0] == s[0]
a4 := [4]byte(s) // panics: len([4]byte) > len(s)
s0 := (*[0]byte)(s) // s0 != nil
s1 := (*[1]byte)(s[1:]) // &s1[0] == &s[1]
s2 := (*[2]byte)(s) // &s2[0] == &s[0]
s4 := (*[4]byte)(s) // panics: len([4]byte) > len(s)
var t []string
t0 := [0]string(t) // ok for nil slice t
t1 := (*[0]string)(t) // t1 == nil
t2 := (*[1]string)(t) // panics: len([1]string) > len(t)
u := make([]byte, 0)
u0 := (*[0]byte)(u) // u0 != nil
對於切片轉數組需要注意的點:
-
當切片的長度小於數組的長度時會 panic,所以 a4 發生了 panic;
-
對 nil 切片轉化,得到長度爲 0 的數組;
對於切片轉數組指針,需要注意的點:
-
與轉數組一樣,當切片的長度小於數組的長度時會 panic,所以 s4、t2 發生了 panic;
-
將非空切片轉爲長度爲 0 的數組,得到的指針不是 nil,比如 s0;將 nil 切片轉爲長度爲 0 的數組,得到的指針爲 nil,比如 t1;
從實例我們可以看出,不管是轉化成數組還是指針,底層都共享相同的數組。
參考資料
[1]
文章: https://polarisxu.studygolang.com/posts/go/dynamic/go1.17-slice-to-array/
[2]
更改: https://go-review.googlesource.com/c/go/+/322329/7/src/crypto/sha256/sha256.go
[3]
提案: https://github.com/golang/go/issues/46505
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/kj77I30VR8Xq-Im9pY6hjg