是什么?为什么?
如何利用unsafe包修改私有成员?
结构体会被分配到一块连续的内存,结构体的地址也代表第一个成员的地址。
如何利用unsafe包获取slice和map的长度?
// 利用unsafe包修改私有成员
type S struct {
name string
language string
age int
}
func main() {
s := S{
name: "张三",
language: "英语",
age: 4,
}
name := (*string)(unsafe.Pointer(&s))
*name = "qcrao"
lang := (*string)(unsafe.Pointer(uintptr(unsafe.Pointer(&s)) + unsafe.Offsetof(s.language)))
*lang = "Golang"
age := (*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&s)) + unsafe.Offsetof(s.age)))
*age = 1
fmt.Println(s)
}
// 利用unsafe获取切片和map的长度.
func main() {
s := make([]int, 9, 20)
var Len = *(*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&s)) + uintptr(8)))
fmt.Println(Len, len(s)) // 9 9
var Cap = *(*int)(unsafe.Pointer(uintptr(unsafe.Pointer(&s)) + uintptr(16)))
fmt.Println(Cap, cap(s)) // 20 20
mp := make(map[string]int)
mp["qcrao"] = 100
mp["stefno"] = 18
count := **(**int)(unsafe.Pointer(&mp))
fmt.Println(count, len(mp)) // 2 2
}