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

對於切片轉數組需要注意的點:

對於切片轉數組指針,需要注意的點:

從實例我們可以看出,不管是轉化成數組還是指針,底層都共享相同的數組。

參考資料

[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