稻花香

软件开发,喜欢读书,编程,禅修

利用unsafe修改私有成员的值

22 Jul 2021 » golang

原理

对于一个结构体,通过 offset 函数可以获取结构体成员的偏移量,进而获取成员的地址,读写该地址的内存,就可以达到改变成员值的目的。

这里有一个内存分配相关的事实:结构体会被分配一块连续的内存,结构体的地址也代表了第一个成员的地址。

type Person struct {
	age int
    name string
}
func main() {
	p := Person{18, "ls"}
	fmt.Println(p)

	lang := (*string)(unsafe.Pointer(uintptr(unsafe.Pointer(&p)) + unsafe.Sizeof(int(0))))
	*lang = "zs"

	fmt.Println(p)
}

输出:

{18 ls}
{18 zs}