欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go unsafe 包的使用詳解

 更新時間:2020年01月20日 08:27:48   作者:大二小的寶  
這篇文章主要介紹了Go unsafe 包的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

unsafe包

golang是一種靜態(tài)的強類型的語言,所有的類型都是不能隨意轉(zhuǎn)換的,Go語言是不允許兩個指針類型進行轉(zhuǎn)換的。go官方是不推薦使用unsafe的操作因為它是不安全的,它繞過了golang的內(nèi)存安全原則,容易使你的程序出現(xiàn)莫名其妙的問題,不利于程序的擴展與維護。但是在很多地方卻是很實用。在一些go底層的包中unsafe包被很頻繁的使用。

unsafe 定義

package unsafe
//ArbitraryType僅用于文檔目的,實際上并不是unsafe包的一部分,它表示任意Go表達式的類型。
type ArbitraryType int
//任意類型的指針,類似于C的*void
type Pointer *ArbitraryType
//確定結構在內(nèi)存中占用的確切大小
func Sizeof(x ArbitraryType) uintptr
//返回結構體中某個field的偏移量
func Offsetof(x ArbitraryType) uintptr
//返回結構體中某個field的對其值(字節(jié)對齊的原因)
func Alignof(x ArbitraryType) uintptr

官方中定義了四個描述:

  1. 任何類型的指針都可以被轉(zhuǎn)化為Pointer
  2. Pointer可以被轉(zhuǎn)化為任何類型的指針
  3. uintptr可以被轉(zhuǎn)化為Pointer
  4. Pointer可以被轉(zhuǎn)化為uintptr

unsafe的使用

類型轉(zhuǎn)換

使用unsafe可以實現(xiàn)類型的轉(zhuǎn)換,下面的例子可以看到i是一個int類型,使用unsafe.Pointer轉(zhuǎn)換成float64并且還修改了指針對應的值。

func main() {
  i := 10
  ip := &i

  fp := (*float64)(unsafe.Pointer(ip))

  *fp = *fp * 3

  fmt.Println(i)
}

// 結果: 30

但是使用起來要十分的小心,如果使用不當會引發(fā)錯誤??梢耘e一個例子:

func main() {
  i := 10
  ip := &i

  fp := (*string)(unsafe.Pointer(ip))

  *fp = "a"

  fmt.Println(i)
  // 結果:19678090
}

上面的誤操作就是把int類型轉(zhuǎn)成了string,并且修改了值導致結果出現(xiàn)了錯誤,并且這種錯誤

根據(jù)位移獲取、修改對象的字段

利用unsafe的Pointer和Offsetof函數(shù),可以獲取對象的屬性,并且可以修改對象的屬性

type Student struct {
  Name string
  Age int
}

func main() {
  s := Student{}
  s.Name = "Peter"
  s.Age = 33

  pStudent := unsafe.Pointer(&s)
  // 整個對象轉(zhuǎn)換成指針,默認是獲取第一個屬性
  name := (*string)(unsafe.Pointer(pStudent))
  fmt.Println("name:", *name)
  // 利用Offsetof獲取age屬性的偏移量獲取屬性
  age := (*int)(unsafe.Pointer(uintptr(pStudent) + unsafe.Offsetof(s.Age)))
  fmt.Println("age:", *age)
  
  // 修改指針的值
  *name = "Mary"
  *age = 20
  fmt.Println(s)
}

獲取私有變量

可以通過unsafe獲取私有變量的值,也可以修改值。這個操作跟上面的獲取值是一樣的簡單的例子如下:

type Teacher struct {
  name string
  age int
}

func main() {
  t := Teacher{"ttt", 20}

  pt := unsafe.Pointer(&t)
  name := (*string)(unsafe.Pointer(pt))
  fmt.Println("name:", *name)
}

根據(jù)sizeof函數(shù)獲取、修改

利用unsafe中的sizeof函數(shù)獲取數(shù)組的值

func main() {
  array := []int{0, 1, -2, 3, 4}
  pointer := &array[0]
  fmt.Print(*pointer, " ")
  memoryAddress := uintptr(unsafe.Pointer(pointer)) + unsafe.Sizeof(array[0])
  for i := 0; i < len(array)-1; i++ {
    pointer = (*int)(unsafe.Pointer(memoryAddress))
    fmt.Print(*pointer, " ")
    memoryAddress = uintptr(unsafe.Pointer(pointer)) + unsafe.Sizeof(array[0])
  }
}

結果:0 1 -2 3 4

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • windows下安裝make及使用makefile文件

    windows下安裝make及使用makefile文件

    這篇文章主要為大家介紹了windows下安裝make及使用makefile文件方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 詳解如何在Go語言中生成隨機種子

    詳解如何在Go語言中生成隨機種子

    這篇文章主要為大家詳細介紹了如何在Go語言中生成隨機種子,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2024-04-04
  • 詳解golang中的method

    詳解golang中的method

    這篇文章主要介紹了golang中的method的相關資料,幫助大家更好的理解和使用golang,感興趣的朋友可以了解下
    2021-01-01
  • 解析Golang和Java的優(yōu)勢與劣勢

    解析Golang和Java的優(yōu)勢與劣勢

    Golang和Java是兩種流行的編程語言,它們在很多方面有著相似之處,但也存在一些重要的區(qū)別,本文將對Golang和Java進行對比,探討它們的特點和適用場景,需要的朋友可以參考下
    2023-10-10
  • golang中new與make的區(qū)別講解

    golang中new與make的區(qū)別講解

    new只能開辟單個空間,不能為引用類型開辟多個空間,并且new是對類型進行內(nèi)存的開辟,返回一個指向該內(nèi)存空間的指針類型,如果使用new去初始化引用數(shù)據(jù)類型,不是很合適(當然,new一個對象還是可以的),因此就需要用到另一個內(nèi)置函數(shù)make,需要的朋友可以參考下
    2023-01-01
  • Golang拾遺之實現(xiàn)一個不可復制類型詳解

    Golang拾遺之實現(xiàn)一個不可復制類型詳解

    在這篇文章中我們將實現(xiàn)一個無法被復制的類型,順便加深對引用類型、值傳遞以及指針的理解。文中的示例代碼講解詳細,感興趣的可以了解一下
    2023-02-02
  • Golang的循環(huán)語句和循環(huán)控制語句詳解

    Golang的循環(huán)語句和循環(huán)控制語句詳解

    循環(huán)語句為了簡化程序中有規(guī)律的重復性操作,需要用到循環(huán)語句,和其他大多數(shù)編程語言一樣,GO的循環(huán)語句有for循環(huán),不同的是沒有while循環(huán),而循環(huán)控制語句可以改變循環(huán)語句的執(zhí)行過程,下面給大家介紹下go循環(huán)語句和循環(huán)控制語句的相關知識,一起看看吧
    2021-11-11
  • golang去除多余的空格與換行符示例代碼

    golang去除多余的空格與換行符示例代碼

    Golang是一種強大的編程語言,提供了豐富的字符串處理功能,這篇文章主要給大家介紹了關于golang去除多余的空格與換行符的相關資料,需要的朋友可以參考下
    2023-10-10
  • go-cqhttp權限管理系統(tǒng)的實現(xiàn)代碼

    go-cqhttp權限管理系統(tǒng)的實現(xiàn)代碼

    這篇文章主要介紹了go-cqhttp權限管理,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • 簡單聊聊Go語言中空結構體和空字符串的特殊之處

    簡單聊聊Go語言中空結構體和空字符串的特殊之處

    在日常的編程過程中,大家應該經(jīng)常能遇到各種”空“吧,比如空指針、空結構體、空字符串等,本文就以?Go?語言為例,一起來看看空結構體和空字符串在?Go?語言中的特殊之處吧
    2024-03-03

最新評論