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

Go語言中的指針運算實例分析

 更新時間:2015年02月26日 15:44:52   作者:不是JS  
這篇文章主要介紹了Go語言中的指針運算技巧,實例分析了Go語言指針運算的實現(xiàn)方法,具有一定參考借鑒價值,需要的朋友可以參考下

本文實例分析了Go語言中的指針運算方法。分享給大家供大家參考。具體分析如下:

Go語言的語法上是不支持指針運算的,所有指針都在可控的一個范圍內(nèi)使用,沒有C語言的*void然后隨意轉(zhuǎn)換指針類型這樣的東西。最近在思考Go如何操作共享內(nèi)存,共享內(nèi)存就需要把指針轉(zhuǎn)成不同類型或者對指針進行運算再獲取數(shù)據(jù)。

這里對Go語言內(nèi)置的unsafe模塊做了一個實驗,發(fā)現(xiàn)通過unsafe模塊,Go語言一樣可以做指針運算,只是比C的方式繁瑣一些,但是理解上是一樣的。

下面是實驗代碼:

復(fù)制代碼 代碼如下:
package main
import "fmt"
import "unsafe"
type Data struct {
    Col1 byte
    Col2 int
    Col3 string
    Col4 int
}
func main() {
    var v Data
    fmt.Println(unsafe.Sizeof(v))
    fmt.Println("----")
    fmt.Println(unsafe.Alignof(v.Col1))
    fmt.Println(unsafe.Alignof(v.Col2))
    fmt.Println(unsafe.Alignof(v.Col3))
    fmt.Println(unsafe.Alignof(v.Col4))
    fmt.Println("----")
    fmt.Println(unsafe.Offsetof(v.Col1))
    fmt.Println(unsafe.Offsetof(v.Col2))
    fmt.Println(unsafe.Offsetof(v.Col3))
    fmt.Println(unsafe.Offsetof(v.Col4))
    fmt.Println("----")
    v.Col1 = 98
    v.Col2 = 77
    v.Col3 = "1234567890abcdef"
    v.Col4 = 23
    fmt.Println(unsafe.Sizeof(v))
    fmt.Println("----")
    x := unsafe.Pointer(&v)
    fmt.Println(*(*byte)(x))
    fmt.Println(*(*int)(unsafe.Pointer(uintptr(x) + unsafe.Offsetof(v.Col2))))
    fmt.Println(*(*string)(unsafe.Pointer(uintptr(x) + unsafe.Offsetof(v.Col3))))
    fmt.Println(*(*int)(unsafe.Pointer(uintptr(x) + unsafe.Offsetof(v.Col4))))
}

以上代碼在我機器上的執(zhí)行結(jié)果如下(結(jié)果會因機器和系統(tǒng)的不同而不太一樣):
32
----
1
4
8
4
----
0
4
8
24
----
32
----
98
77
1234567890abcdef
23

unsafe模塊的文檔中提到幾條轉(zhuǎn)換規(guī)則,理解了以后就很容易做指針運算了:

A pointer value of any type can be converted to a Pointer.
A Pointer can be converted to a pointer value of any type.
A uintptr can be converted to a Pointer.
A Pointer can be converted to a uintptr.

希望本文所述對大家的Go語言程序設(shè)計有所幫助。

相關(guān)文章

  • GoLand編寫 TCP 端口掃描器的詳細過程

    GoLand編寫 TCP 端口掃描器的詳細過程

    TCP,也就是傳輸控制協(xié)議(Transmission Control Protocol),這篇文章主要介紹了Go語言(Golang)編寫 TCP 端口掃描器,需要的朋友可以參考下
    2023-05-05
  • Golang壓縮Jpeg圖片和PNG圖片的操作

    Golang壓縮Jpeg圖片和PNG圖片的操作

    這篇文章主要介紹了Golang壓縮Jpeg圖片和PNG圖片的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go+Lua解決Redis秒殺中庫存與超賣問題

    Go+Lua解決Redis秒殺中庫存與超賣問題

    本文主要介紹了Go+Lua解決Redis秒殺中庫存與超賣問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Go?語言進階單元測試示例詳解

    Go?語言進階單元測試示例詳解

    這篇文章主要為大家介紹了Go?語言進階單元測試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Go錯誤和異常CGO?fallthrough處理教程詳解

    Go錯誤和異常CGO?fallthrough處理教程詳解

    這篇文章主要為大家介紹了Go錯誤和異常CGO?fallthrough使用教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • go語言標準庫fmt包的一鍵入門

    go語言標準庫fmt包的一鍵入門

    這篇文章主要為大家介紹了go語言標準庫fmt包的一鍵入門使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 詳解Go 1.22 for循環(huán)的兩處重要更新

    詳解Go 1.22 for循環(huán)的兩處重要更新

    這篇文章主要詳細介紹了Go 1.22 for循環(huán)的兩處重要更新,Go 1.22 版本于 2024 年 2 月 6 日發(fā)布,引入了幾個重要的特性和改進,在語言層面上,這個版本對 for 循環(huán)進行了兩處更新,本文將會對 for 循環(huán)的兩個更新進行介紹,需要的朋友可以參考下
    2024-02-02
  • 淺談Go1.18中的泛型編程

    淺談Go1.18中的泛型編程

    本文主要介紹了Go1.18中的泛型編程,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Go語言--切片(Slice)詳解

    Go語言--切片(Slice)詳解

    這篇文章主要介紹了Go語言--切片(Slice),Go 語言切片是對數(shù)組的抽象,下面文章小編將為大家詳細介紹該內(nèi)容,需要的朋友可以參考下,希望對你有所幫助
    2021-10-10
  • Golang Printf,Sprintf,Fprintf 格式化詳解

    Golang Printf,Sprintf,Fprintf 格式化詳解

    這篇文章主要介紹了Golang Printf,Sprintf,Fprintf 格式化詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03

最新評論