日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Go unsafe Pointer

發布時間:2023/12/4 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go unsafe Pointer 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Go unsafe Pointer

Go被設計為一種強類型的靜態語言,強類型意味著類型一旦確定就無法更改,靜態意味著類型檢查在運行前就做了。

指針類型轉換

為了安全考慮,兩個不同類型的指針不能相互轉換,例如:

package mainfunc main() {i := 10ip := &ivar fp *float64 = (*float64)(ip)//會提示 Cannot convert an expression of the type '*int' to the type '*float64' 無法進行強制類型轉換 }

如果非要進行轉換,可以使用unsafe包中的Pointer。

Pointer

unsafe.Pointer是一種特殊意義的指針。

package mainimport ("fmt""unsafe" )func main() {i := 10ip := &ifp := (*float64)(unsafe.Pointer(ip))*fp = *fp * 3fmt.Println(i) } //output: 30

所以,使用unsafe.Pointer這個指針,我們可以在*T之間做任何轉換。可以看到Pointer是一個 *int。

type ArbitraryType int type Pointer *ArbitraryType

我們可以看下關于unsafe.Pointer的四個原則:

  • 任何指針都可以轉換為unsafe.Pointer;
  • unsafe.Pointer可以轉換為任何指針;
  • uintptr可以轉換為unsafe.Pointer;
  • unsafe.Pointer可以轉換為uintptr;
  • 對于后面兩個規則,我們知道*T是不能計算偏移量的,也不能進行計算。但是uintptr可以,我們可以把指針轉換為uintptr再進行偏移計算,這樣就可以訪問特定的內存了,例如:

    type user struct {name stringage int }func main() {u := new(user)fmt.Println(*u)pName := (*string)(unsafe.Pointer(u))*pName = "demo"pAge := (*int)(unsafe.Pointer(uintptr(unsafe.Pointer(u)) + unsafe.Offsetof(u.age)))*pAge = 20fmt.Println(*u) } // output: {0} // {demo 20}

    最后

    unsafe是不安全的,應該盡量少的去使用。

    Package unsafe contains operations that step around the type safety of Go programs.

    Packages that import unsafe may be non-portable and are not protected by the Go 1 compatibility guidelines.

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的Go unsafe Pointer的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。