在 Go 1.16 發(fā)布六個(gè)月后,Go 1.17 終于發(fā)布。主要更新在工具鏈、運(yùn)行時(shí)和庫(kù)的實(shí)現(xiàn)方面。一如既往,該版本保持了 Go 1 的兼容性承諾,Go 語(yǔ)言官方稱:期望幾乎所有的Go程序都能像以前一樣繼續(xù)編譯和運(yùn)行。
Go 1.17包括對(duì)語(yǔ)言的三個(gè)小的增強(qiáng)。
- 從 slice 到數(shù)組指針的轉(zhuǎn)換。
[]T
類型的表達(dá)式s
現(xiàn)在可以被轉(zhuǎn)換為數(shù)組指針類型*[N]T
。如果a
是這種轉(zhuǎn)換的結(jié)果,那么在范圍內(nèi)的相應(yīng)指數(shù)指的是相同的基礎(chǔ)元素。&a[i] == &s[i]
對(duì)于0 <= i < N
。如果len(s)
小于N
,轉(zhuǎn)換就會(huì)陷入困境。 unsafe.Add
:unsafe.Add(ptr, len)
向ptr
添加len
,并返回更新的指針unsafe.Pointer(uintptr(ptr)+uintptr(len))
。unsafe.Slice
。對(duì)于類型為*T
的表達(dá)式ptr
,unsafe.Slice(ptr, len)
返回一個(gè)類型為[]T
的片斷,其底層數(shù)組從ptr
開(kāi)始,長(zhǎng)度和容量為len
。
增加了包unsafe的增強(qiáng)功能,以簡(jiǎn)化編寫符合unsafe.Pointer
的安全規(guī)則的代碼,但這些規(guī)則沒(méi)有改變。特別是,正確使用unsafe.Pointer
的現(xiàn)有程序仍然有效,而新程序在使用unsafe.Add
或unsafe.Slice
時(shí)仍然必須遵循規(guī)則。
請(qǐng)注意,從slice到數(shù)組指針的新轉(zhuǎn)換是類型轉(zhuǎn)換在運(yùn)行時(shí)可能發(fā)生恐慌的第一種情況。假設(shè)類型轉(zhuǎn)換永遠(yuǎn)不會(huì)恐慌的分析工具應(yīng)該被更新以考慮這種可能性。
更多版本細(xì)節(jié),請(qǐng)查看官方 Release Notes