关于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字段。

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

  

posted @ 2017-02-03 23:03  walkabc  阅读(6146)  评论(0编辑  收藏  举报