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