Go unsafe Pointer
Go unsafe Pointer
Go被設(shè)計(jì)為一種強(qiáng)類型的靜態(tài)語言,強(qiáng)類型意味著類型一旦確定就無法更改,靜態(tài)意味著類型檢查在運(yùn)行前就做了。
指針類型轉(zhuǎn)換
為了安全考慮,兩個(gè)不同類型的指針不能相互轉(zhuǎn)換,例如:
package mainfunc main() {i := 10ip := &ivar fp *float64 = (*float64)(ip)//會(huì)提示 Cannot convert an expression of the type '*int' to the type '*float64' 無法進(jìn)行強(qiáng)制類型轉(zhuǎn)換 }如果非要進(jìn)行轉(zhuǎn)換,可以使用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這個(gè)指針,我們可以在*T之間做任何轉(zhuǎn)換。可以看到Pointer是一個(gè) *int。
type ArbitraryType int type Pointer *ArbitraryType我們可以看下關(guān)于unsafe.Pointer的四個(gè)原則:
對于后面兩個(gè)規(guī)則,我們知道*T是不能計(jì)算偏移量的,也不能進(jìn)行計(jì)算。但是uintptr可以,我們可以把指針轉(zhuǎn)換為uintptr再進(jìn)行偏移計(jì)算,這樣就可以訪問特定的內(nèi)存了,例如:
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是不安全的,應(yīng)該盡量少的去使用。
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.
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Go unsafe Pointer的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 冲刺 1nm 制程,日本 Rapidus
- 下一篇: Slice的本质