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

作者:不是JS 时间:2024-05-08 10:45:52 

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

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

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

下面是实验代码:

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语言程序设计有所帮助。

标签:Go语言,指针,运算
0
投稿

猜你喜欢

  • Python pyecharts绘制词云图代码

    2021-03-18 03:17:08
  • sqlserver利用存储过程去除重复行的sql语句

    2024-01-20 06:28:54
  • Python3读取UTF-8文件及统计文件行数的方法

    2022-06-03 15:02:45
  • Python+OpenCV之形态学操作详解

    2021-11-24 23:37:58
  • 写给新手同学的vuex快速上手指北小结

    2024-04-27 16:03:33
  • Python批量修改文件名,文件再多也只要一秒

    2022-01-18 20:35:06
  • 微信小程序 textarea 层级过高问题简单解决方案

    2024-04-18 09:36:41
  • 如何基于Python实现数字类型转换

    2023-10-08 00:57:13
  • asp截取字符串的两种应用

    2009-08-19 17:11:00
  • MySQL的存储函数与存储过程相关概念与具体实例详解

    2024-01-19 05:50:32
  • python matplotlib绘制三维图的示例

    2023-03-04 16:35:48
  • electron-vue利用webpack打包实现多页面的入口文件问题

    2024-05-13 10:39:51
  • SQL Server Table中XML列的操作代码

    2024-01-23 14:21:11
  • uniapp中微信小程序与H5相互跳转以及传参详解(webview)

    2024-04-10 16:20:37
  • ajax 同步请求和异步请求的差异分析

    2011-07-05 12:36:04
  • php支持中文字符串分割的函数

    2023-11-18 21:42:04
  • MYSQL锁表问题的解决方法

    2024-01-19 00:53:35
  • Python pandas实现excel工作表合并功能详解

    2021-05-23 01:33:40
  • 深入探寻javascript定时器

    2024-04-29 13:36:55
  • Go语言接口用法实例

    2024-02-04 22:27:30
  • asp之家 网络编程 m.aspxhome.com