源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Go语言中的指针运算实例分析

  • 时间:2021-11-26 05:45 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Go语言中的指针运算实例分析
本文实例分析了Go语言中的指针运算方法。分享给大家供大家参考。具体分析如下: Go语言的语法上是不支持指针运算的,所有指针都在可控的一个范围内使用,没有C语言的*void然后随意转换指针类型这样的东西。最近在思考Go如何操作共享内存,共享内存就需要把指针转成不同类型或者对指针进行运算再获取数据。 这里对Go语言内置的unsafe模块做了一个实验,发现通过unsafe模块,Go语言一样可以做指针运算,只是比C的方式繁琐一些,但是理解上是一样的。 下面是实验代码:
[u]复制代码[/u] 代码如下:
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)))) }
以上代码在我机器上的执行结果如下(结果会因机器和系统的不同而不太一样): 32 ---- 1 4 8 4 ---- 0 4 8 24 ---- 32 ---- 98 77 1234567890abcdef 23 unsafe模块的文档中提到几条转换规则,理解了以后就很容易做指针运算了: 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语言程序设计有所帮助。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部