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

  

本文实例分析了去语言中的指针运算方法。分享给大家供大家参考。具体分析如下:

  

去语言的语法上是不支持指针运算的,所有指针都在可控的一个范围内使用,没有C语言的*空然后随意转换指针类型这样的东西。最近在思考去如何操作共享内存,共享内存就需要把指针转成不同类型或者对指针进行运算再获取数据。

  

这里对去语言内置的不安全模块做了一个实验,发现通过不安全模块,去语言一样可以做指针运算,只是比C的方式繁琐一些,但是理解上是一样的。

  

下面是实验代码:
  代码如下:主要包
  进口“fmt”
  进口“不安全”
  类型数据结构{
  ,,Col1字节
  ,,Col2 int
  ,,Col3字符串
  ,,Col4 int
  }
  函数main () {
  ,,var v数据
  ,,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=" 1234567890六边形abcdef "
  ,,v。Col4=23
  ,,fmt.Println (unsafe.Sizeof (v)
  ,,fmt.Println (——)
  ,,x:=unsafe.Pointer(和v)
  ,,fmt.Println(*(*字节)(x))
  ,,int fmt.Println (* (*) (unsafe.Pointer (uintptr (x) + unsafe.Offsetof (v.Col2))))
  ,,字符串fmt.Println (* (*) (unsafe.Pointer (uintptr (x) + unsafe.Offsetof (v.Col3))))
  ,,int fmt.Println (* (*) (unsafe.Pointer (uintptr (x) + unsafe.Offsetof (v.Col4))))
  }

  

以上代码在我机器上的执行结果如下(结果会因机器和系统的不同而不太一样):
  32
  - - - - -
  1
  4
  8
  4
  - - - - -
  0
  4
  8
  24
  - - - - -
  32
  - - - - -
  98年
  77年
  1234567890六边形abcdef
  23日

  

安全模块的文档中提到几条转换规则,理解了以后就很容易做指针运算了:

  

任何类型的指针的值可以转换为一个指针。
  一个指针可以转换成任何类型的指针的值。
  uintptr可以转换为一个指针。
  可以转换为一个指针uintptr。

  

希望本文所述对大家的去语言程序设计有所帮助。

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