中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言中unsafe如何使用

發布時間:2021-07-06 15:51:35 來源:億速云 閱讀:156 作者:Leah 欄目:大數據

這期內容當中小編將會給大家帶來有關Go語言中unsafe如何使用,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

1.指針類型介紹:

對于Go語言的指針類型來說,指針類型的限制比較多,主要有四點,并且在Go語言的編譯階段就可以檢測出來。

限制1: 指針不可以進行數學計算。

限制2:不同類型的指針不能夠相互賦值。

限制3:不同類型的指針不能夠==或者!=的比較操作。

限制4:不同類型的指針不能夠相互轉化。

備注:Go語言又對類型要求的非常嚴格,就連type INT int中的int和INT都認為不是同一種類型,這就導致了指針的限制條件更加苛刻了。

1)指針變量正常使用的例子:

Go語言中unsafe如何使用

2)指針變量受限制的例子:

Go語言中unsafe如何使用

2. unsafe介紹

通過前面指針類型的介紹,我們能夠看出來unsafe之所以存在,就是因為Go語言對指針類型的限制太苛刻導致的。而unsafe的出現,恰恰彌補了指針變量的這些限制,不過從Go語言的設計者的角度來說,其實他們是不希望大家使用unsafe這個包的,不過有些場景又不得不用它,所以才特意起了個名字叫做unsafe的包,來使用它。

2.1 unsafe使用的場景

場景1:解決第三方庫提供的指針類型所使用的數據類型的不匹配問題。

場景2:解決數據結構體中,不可見屬性的取值和修改操作。

2.2 unsafe的特點

場景1:任何類型的指針均可以轉換成unsafe.Pointer,unsafe.Pointer也可以轉換成任何類型的指針,例子如下所示:

Go語言中unsafe如何使用

通過上面例子,以及輸出結果,我們可以看出,unsafe.Pointer可以將int類型的指針變量轉換成float32類型的指針變量。

場景2: uintptr 可以轉換為 Pointer,Pointer 也可以轉換為 uintptr,例子如下:

Go語言中unsafe如何使用

結果分析:通過上例的輸出結果,可以看出unsafe包是如何來操作,以及修改數據結構Node中不可見的元素age和name的。在修改Node中的第一個元素的時候,我們只需要取到該數據結構的存儲位置就可以;在修改后續的元素的時候,我們需要采用unsafe.Offsetof計算偏移的方式來找到對應的元素的存儲位置,然后再去修改這個數據。

2.3 uintptr不要賦值給臨時變量

從 GC 的角度來看,uintptr 類型的臨時變量只是一個無符號整數,并不知道它是一個指針地址,因此當滿足一定條件后,ptr 這個臨時變量是可能被垃圾回收掉的,所以我們不能夠將uintptr(nP)先賦值給一個臨時變量,在進行后面的取地址操作,代碼如下所示:

Go語言中unsafe如何使用

上述就是小編為大家分享的Go語言中unsafe如何使用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兴安县| 苏尼特右旗| 松桃| 廉江市| 手游| 应城市| 江达县| 双峰县| 芒康县| 东城区| 孟村| 思南县| 广宁县| 通化市| 平陆县| 望谟县| 平遥县| 永福县| 广饶县| 文昌市| 柯坪县| 平乡县| 上饶市| 灵武市| 冷水江市| 九龙城区| 孙吴县| 婺源县| 理塘县| 扎鲁特旗| 宁国市| 烟台市| 辉南县| 星座| 镇赉县| 离岛区| 瑞丽市| 新源县| 吴桥县| 甘南县| 大庆市|