对于指针类型不安全编程,通过指针值以及偏移量操作slice私有属性
// 通过指针值获取切片
func TestGetPrivate(t *testing.T) {
s := []int{1, 2, 3}
sptr := uintptr(unsafe.Pointer(&s)) // 获取当前结构体实例的指针值
t.Log(sptr)
arrPtr := (*[]int)(unsafe.Pointer(sptr))// 对于slice结构体而言,第一个属性就是数组指针类型
arr := *arrPtr
t.Logf("%v,%T", arr, arr)
lenPtrAddr := sptr + unsafe.Sizeof(unsafe.Pointer(sptr))// 根据第一个属性的指针值以及第一个属性类型的长度,获取第二个属性的地址值
lenPtr := (*int)(unsafe.Pointer(lenPtrAddr)) // 获取len属性的地址值
assert.Equal(t, len(s), *lenPtr)
}