日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Go|1.17正式版本之初印象

8月17日凌晨,Go 1.17 正式發(fā)布!

我們注重客戶提出的每個(gè)要求,我們充分考慮每一個(gè)細(xì)節(jié),我們積極的做好成都做網(wǎng)站、成都網(wǎng)站建設(shè)服務(wù),我們努力開(kāi)拓更好的視野,通過(guò)不懈的努力,創(chuàng)新互聯(lián)贏得了業(yè)內(nèi)的良好聲譽(yù),這一切,也不斷的激勵(lì)著我們更好的服務(wù)客戶。 主要業(yè)務(wù):網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),微信平臺(tái)小程序開(kāi)發(fā),網(wǎng)站開(kāi)發(fā),技術(shù)開(kāi)發(fā)實(shí)力,DIV+CSS,PHP及ASP,ASP.Net,SQL數(shù)據(jù)庫(kù)的技術(shù)開(kāi)發(fā)工程師。

迫不及待的閱讀了版本說(shuō)明:https://golang.google.cn/doc/go1.17。

語(yǔ)言變化

該版本主要包含三個(gè)小小的語(yǔ)法(糖)增強(qiáng):

  1. 增加了slice對(duì)象直接強(qiáng)制類型轉(zhuǎn)換為數(shù)組指針的能力。
  2. 在unsafe中增加了Add函數(shù)。
  3. 在unsafe中增加了Slice函數(shù)。

slice轉(zhuǎn)數(shù)組指針

這是Go語(yǔ)言規(guī)范中新添加的內(nèi)容:https://golang.google.cn/ref/spec#Conversions_from_slice_to_array_pointer。

直接上用例:

從上圖代碼可以看出,有了這個(gè)新的語(yǔ)法功能,類型轉(zhuǎn)換確實(shí)方便了很多。

但是,如果轉(zhuǎn)換的目標(biāo)數(shù)組長(zhǎng)度(len)大于slice的長(zhǎng)度(len),編譯雖然成功,可是運(yùn)行時(shí)必定panic。

這是因?yàn)椋篏o編譯器知道slice的長(zhǎng)度是4,目標(biāo)數(shù)組長(zhǎng)度是5,這是數(shù)組越界訪問(wèn),是錯(cuò)誤的,于是將以下源代碼:

 
 
 
 
  1. a5 := (*[5]int)(slice) 
  2. fmt.Println("a5 =", *a5) 

直接替換為以下runtime.panicSliceConvert函數(shù)調(diào)用,使進(jìn)程異常退出。

這是Go語(yǔ)言中的一個(gè)很奇怪現(xiàn)象:即使在編譯時(shí)期發(fā)現(xiàn)了代碼異常,但是編譯成功,把異常編碼成運(yùn)行時(shí)panic。

已經(jīng)遇到過(guò)幾次這種情況。

如果在 Go 1.17 版本之前實(shí)現(xiàn)slice轉(zhuǎn)數(shù)組指針的功能,實(shí)現(xiàn)如下,稍微復(fù)雜一點(diǎn):

Go 1.17版本完全兼容老版本的語(yǔ)法,該代碼在Go 1.17運(yùn)行是完全沒(méi)有問(wèn)題的。

只不過(guò)數(shù)組越界問(wèn)題,需要開(kāi)發(fā)者自己謹(jǐn)慎處理。

unsafe.Add

這是在unsafe/unsafe.go源碼文件中新增加的一個(gè)內(nèi)置函數(shù),該函數(shù)沒(méi)有函數(shù)體,是由Go編譯器負(fù)責(zé)實(shí)現(xiàn)的。

其實(shí)現(xiàn)等同于以下代碼:

 
 
 
 
  1. func Add(ptr Pointer, len IntegerType) Pointer { 
  2.     return Pointer(uintptr(ptr) + uintptr(len)) 

相關(guān)源碼鏈接:

  • https://github.com/golang/go/blob/go1.17/src/unsafe/unsafe.go#L217
  • https://github.com/golang/go/blob/go1.17/src/go/types/builtins.go#L589

unsafe.Slice

這是在unsafe/unsafe.go源碼文件中新增加的一個(gè)內(nèi)置函數(shù),該函數(shù)沒(méi)有函數(shù)體,是由Go編譯器負(fù)責(zé)實(shí)現(xiàn)的。

該函數(shù)像是一個(gè)泛型函數(shù)。

 
 
 
 
  1. func Slice(ptr *ArbitraryType, len IntegerType) []ArbitraryType { 
  2.   return (*[len]ArbitraryType)(unsafe.Pointer(ptr))[:] 

相關(guān)源碼鏈接:

  • https://github.com/golang/go/blob/go1.17/src/unsafe/unsafe.go#L233
  • https://github.com/golang/go/blob/go1.17/src/go/types/builtins.go#L690

調(diào)用棧邊界檢查

如果沒(méi)有特殊標(biāo)記,Go編譯器會(huì)在函數(shù)的入口處自動(dòng)添加檢查棧是否需要擴(kuò)增的指令。

在 Go 1.17 之前的版本中,檢查是通過(guò)FS寄存器讀取線程本地存儲(chǔ)(TLS)中的棧保護(hù)標(biāo)記(runtime.g.stackguard0)與RSP寄存器比較實(shí)現(xiàn)的。

在 Go 1.17 版本中,發(fā)現(xiàn)這項(xiàng)檢查發(fā)現(xiàn)了變更:檢查是通過(guò)R14寄存器與RSP寄存器比較實(shí)現(xiàn)的。

該檢查由4條指令精簡(jiǎn)為2條指令,效率絕對(duì)提高許多,因?yàn)樵摍z查幾乎覆蓋所有開(kāi)發(fā)者實(shí)現(xiàn)的Go函數(shù)。

這是一項(xiàng)重大更新。

因?yàn)闀r(shí)間問(wèn)題,尚未對(duì)其細(xì)節(jié)做進(jìn)一步研究。

調(diào)用約定

在簡(jiǎn)單的調(diào)試過(guò)程中,發(fā)現(xiàn)Go 1.17版本的函數(shù)調(diào)用,返回值竟然使用的RAX寄存器,而且參數(shù)與使用了寄存器。

在Go 1.17之前的版本,所有開(kāi)發(fā)者實(shí)現(xiàn)的Go函數(shù),參數(shù)和返回值全部使用棧內(nèi)存?zhèn)鬟f;只有少數(shù)匯編實(shí)現(xiàn)的函數(shù)、某些特殊函數(shù)、系統(tǒng)調(diào)用使用了寄存器傳遞參數(shù)和返回值。

而在該版本中,參數(shù)和返回值都使用了寄存器。似乎在向UNIX環(huán)境下的函數(shù)調(diào)用約定靠攏。

這是一項(xiàng)重大更新。

畢竟寄存器數(shù)量是有限的,具體使用哪些寄存器傳遞參數(shù)、返回值,哪些參數(shù)需要通過(guò)棧內(nèi)存?zhèn)鬟f,需要找空閑時(shí)間探索一番。

該變更在版本說(shuō)明的編譯器部分有記錄:https://golang.google.cn/doc/go1.17#compiler。

其他

可移植性方面,增加了新系統(tǒng)和處理器架構(gòu)的支持。

在工具鏈方面,也有一些變更。

本文轉(zhuǎn)載自微信公眾號(hào)「Golang In Memory」


分享名稱:Go|1.17正式版本之初印象
文章路徑:http://www.5511xx.com/article/ccsipjc.html