标签:bit lan 结构体 之间 ola fse 结果 func 字段
import (
"testing"
"unsafe"
)
type Users struct {
Age int32
Name string
}
func TestUnsafe(t *testing.T) {
var user Users
var a byte
/*
func Alignof(x ArbitraryType) uintptr
获取变量以多数字节对齐
*/
align := unsafe.Alignof(a)
t.Log("align is: ", align)
/*
func Offsetof(x ArbitraryType) uintptr
Offsetof返回x所代表的结构体中字段的偏移量,它必须是structValue.field的形式。该方法返回结构体起始处到该字段之间的字节数。
*/
offset := unsafe.Offsetof(user.Name)
t.Log("offset is:", offset)
/*
func Sizeof(x ArbitraryType) uintptr
Sizeof获取变量的大小,类似于C/C++中使用sizeof(变量)返回的结果。
*/
size := unsafe.Sizeof(a)
t.Log("size is:", size)
/*
Pointer类型
type Pointer *ArbitraryType
使用说明:
任何类型的指针可以转换为Pointer类型。
Pointer类型可以转换为任何类型的指针值。
uintptr和Pointer类型可以相互转换。
由于指针类型都是不可操作的,所以任意类型的指针必须转换为Pointer类型,
再由Pointer类型转换为uintptr类型,由于uintptr类型不是指针类型,就可以进行运算了。
运算完成后,把uintptr类型转换为Pointer类型后再转换为调用者想要的指针类型。
*/
nameAddress := (uintptr)(unsafe.Pointer(&(user.Name)))
t.Log("nameAddress is:", nameAddress)
userAddr := (uintptr)(unsafe.Pointer(&(user)))
t.Log("userAddr is:", userAddr)
user.Age = 10
user.Name = "mike"
//操作实例
userAddr2 := nameAddress - offset
t.Log("userAdd2 is:", userAddr2)
user2 := (*Users)(unsafe.Pointer(userAddr2))
t.Log("user2.Age is:", user2.Age)
}
标签:bit lan 结构体 之间 ola fse 结果 func 字段
原文地址:https://www.cnblogs.com/lemonzwt/p/11348823.html