您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關Go語言中unsafe如何使用,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
對于Go語言的指針類型來說,指針類型的限制比較多,主要有四點,并且在Go語言的編譯階段就可以檢測出來。
限制1: 指針不可以進行數學計算。
限制2:不同類型的指針不能夠相互賦值。
限制3:不同類型的指針不能夠==或者!=的比較操作。
限制4:不同類型的指針不能夠相互轉化。
備注:Go語言又對類型要求的非常嚴格,就連type INT int中的int和INT都認為不是同一種類型,這就導致了指針的限制條件更加苛刻了。
1)指針變量正常使用的例子:
2)指針變量受限制的例子:
通過前面指針類型的介紹,我們能夠看出來unsafe之所以存在,就是因為Go語言對指針類型的限制太苛刻導致的。而unsafe的出現,恰恰彌補了指針變量的這些限制,不過從Go語言的設計者的角度來說,其實他們是不希望大家使用unsafe這個包的,不過有些場景又不得不用它,所以才特意起了個名字叫做unsafe的包,來使用它。
2.1 unsafe使用的場景
場景1:解決第三方庫提供的指針類型所使用的數據類型的不匹配問題。
場景2:解決數據結構體中,不可見屬性的取值和修改操作。
2.2 unsafe的特點
場景1:任何類型的指針均可以轉換成unsafe.Pointer,unsafe.Pointer也可以轉換成任何類型的指針,例子如下所示:
通過上面例子,以及輸出結果,我們可以看出,unsafe.Pointer可以將int類型的指針變量轉換成float32類型的指針變量。
場景2: uintptr 可以轉換為 Pointer,Pointer 也可以轉換為 uintptr,例子如下:
結果分析:通過上例的輸出結果,可以看出unsafe包是如何來操作,以及修改數據結構Node中不可見的元素age和name的。在修改Node中的第一個元素的時候,我們只需要取到該數據結構的存儲位置就可以;在修改后續的元素的時候,我們需要采用unsafe.Offsetof計算偏移的方式來找到對應的元素的存儲位置,然后再去修改這個數據。
2.3 uintptr不要賦值給臨時變量
從 GC 的角度來看,uintptr 類型的臨時變量只是一個無符號整數,并不知道它是一個指針地址,因此當滿足一定條件后,ptr 這個臨時變量是可能被垃圾回收掉的,所以我們不能夠將uintptr(nP)先賦值給一個臨時變量,在進行后面的取地址操作,代碼如下所示:
上述就是小編為大家分享的Go語言中unsafe如何使用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。