关于golang中强制类型转换,原生指针的使用

  Golang中如何进行类型转换,也正好可以探究下golang的内存布局

package main

import (
	"fmt"
)

type A struct {
	name string
	age  int8
}

type B struct {
	notname string
	notage  int8
	sex     int8
}

func main() {
	b := &B{notname: "我是B", notage: 90, sex: 1}
	a := (*A)(b)//这是编译不通过,可以接着看下面的代码
	fmt.Println(a.name)
}

  上面的代码是通不过编译的

./typecast.go:20: cannot convert b (type *B) to type *A

  那么如何进行类型的强制类型转换呢?

  

package main

import (
	"fmt"
	"unsafe"
)

type A struct {
	name string
	age  int8
}

type B struct {
	notname string
	notage  int8
	sex     int8
}

func main() {
	b := &B{notname: "我是B", notage: 90, sex: 1}
	a := (*A)(unsafe.Pointer(b))
	fmt.Println(a.name)
}

  这样就能通过类型转换了。可以看到只要类型的内存布局一致就可以了,即使B类型多一个sex字段。

  这样的转换方式是通过原生指针的方式进行转换的。  

  

转载于:https://www.cnblogs.com/hitfire/articles/6363696.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值