go struct 与 []byte 的几个转换

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

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值