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