package main
import (
"fmt"
"unsafe"
)
type Person struct{
name [10]byte
age int
}
type SliceMock struct {
addr uintptr
len uintptr
cap uintptr
}
func main(){
person := Person{}
copy(person.name[:],[]byte("liming"))
person.age = 10
fmt.Printf("%+v %v\n",person,uintptr(unsafe.Pointer(&person)))
const Person_Size = unsafe.Sizeof(person)
fmt.Printf("%d\n",Person_Size)
var tmp1 [Person_Size]byte
var tmp2 []byte
var tmp3 []byte
var tmp4 []byte
copy(tmp1[:], (*(*[Person_Size]byte)(unsafe.Pointer(&person)))[:] )
tmp2 = (*(*[]byte) (unsafe.Pointer(&person)))
tmp3 = (*(*[Person_Size]byte) (unsafe.Pointer(&person)))[:]
tmp4 = (*(*[]byte) (unsafe.Pointer(&SliceMock{uintptr(unsafe.Pointer(&person)),Person_Size,Person_Size})))
fmt.Println("tmp1 ",tmp1)
fmt.Println("tmp2 ",tmp2)
fmt.Println("tmp3 ",tmp3)
fmt.Println("tmp4 ",tmp4)
fmt.Println(uintptr(unsafe.Pointer(&tmp1)),uintptr(unsafe.Pointer(&tmp2)),uintptr(unsafe.Pointer(&tmp3[0])),uintptr(unsafe.Pointer(&tmp4[0])))
var person1 *Person
var person2 *Person
var person3 *Person
var person4 *Person
person1 = (*Person)(unsafe.Pointer(&tmp1))
person2 = (*Person)(unsafe.Pointer(&tmp2))
person3 = (*Person)(unsafe.Pointer(&tmp3[0]))
person4 = (*Person)(unsafe.Pointer(&tmp4[0]))
fmt.Printf("person1 %+v\n",person1)
fmt.Printf("person2 %+v\n",person2)
fmt.Printf("person3 %+v\n",person3)
fmt.Printf("person4 %+v\n",person4)
fmt.Println()
person.age = 20
fmt.Printf("%+v %v\n",person,uintptr(unsafe.Pointer(&person)))
fmt.Println("tmp1 ",tmp1)
fmt.Println("tmp2 ",tmp2)
fmt.Println("tmp3 ",tmp3)
fmt.Println("tmp4 ",tmp4)
fmt.Printf("person1 %+v\n",person1)
fmt.Printf("person2 %+v\n",person2)
fmt.Printf("person3 %+v\n",person3)
fmt.Printf("person4 %+v\n",person4)
}
/*
{name:[108 105 109 105 110 103 0 0 0 0] age:10} 824633811424
24
tmp1 [108 105 109 105 110 103 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0]
tmp2 []
tmp3 [108 105 109 105 110 103 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0]
tmp4 [108 105 109 105 110 103 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0]
824633811520 824633770112 824633811424 824633811424
person1 &{name:[108 105 109 105 110 103 0 0 0 0] age:10}
person2 &{name:[108 105 109 105 110 103 0 0 0 0] age:10}
person3 &{name:[108 105 109 105 110 103 0 0 0 0] age:10}
person4 &{name:[108 105 109 105 110 103 0 0 0 0] age:10}
{name:[108 105 109 105 110 103 0 0 0 0] age:20} 824633811424
tmp1 [108 105 109 105 110 103 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0]
tmp2 []
tmp3 [108 105 109 105 110 103 0 0 0 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0]
tmp4 [108 105 109 105 110 103 0 0 0 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0]
person1 &{name:[108 105 109 105 110 103 0 0 0 0] age:10}
person2 &{name:[108 105 109 105 110 103 0 0 0 0] age:10}
person3 &{name:[108 105 109 105 110 103 0 0 0 0] age:20}
person4 &{name:[108 105 109 105 110 103 0 0 0 0] age:20}
*/
tmp1用了copy,所以指向一段新的内存空间,原来的struct修改不影响tmp1
tmp2,失去了长度
tmp3,保留了长度
按道理来说tmp2和tmp3应该是指向原来的struct,思考中。。。
参考:
https://www.cnblogs.com/hualou/p/12069757.html