Go语言中的指针运算实例分析
程序员文章站
2022-08-29 23:33:22
本文实例分析了go语言中的指针运算方法。分享给大家供大家参考。具体分析如下:
go语言的语法上是不支持指针运算的,所有指针都在可控的一个范围内使用,没有c语言的*void...
本文实例分析了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))))
}
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语言中的range用法实例分析
下一篇: Go语言中嵌入C语言的方法