type cast - hanyong/note GitHub Wiki

go 类型转换

go 语言继承与匿名字段 提到了几种类型转换, 下面再看几种场景。

// "github.com/shipyard/shipyard/atest/a/x"
// "github.com/shipyard/shipyard/atest/b/x"
// A.go
package x

import (

)

type A struct {
	X int
}
// atest.go
package main 

import (
	"fmt"
	"reflect"
	"unsafe"
	a "github.com/shipyard/shipyard/atest/a/x"
	b "github.com/shipyard/shipyard/atest/b/x"
)

func main() {
	var xa = &a.A{}
	var xat = reflect.TypeOf(xa)
	fmt.Println(xa, xat)
	
	var xb1, _ = ((interface{})(xa)).(*b.A)
	var xb1t = reflect.TypeOf(xb1)
	fmt.Println(xb1, xb1t)
	
	var xb2 = (*b.A)(unsafe.Pointer(xa))
	var xb2t = reflect.TypeOf(xb2)
	fmt.Println(xb2, xb2t)
	
	fmt.Println(xat == xb1t, xb1t == xb2t)
}

输出结果为:

&{0} *x.A
<nil> *x.A
&{0} *x.A
false true

结论:

  1. 首先, 不同路径的同包名类名, 反射 reflect 看到的类名一样, 实际上依然是不同的类型。
  2. 布局相同的结构体, 可以类型强转之后访问, 这是不安全的强转, 与 C 的强转类似。
⚠️ **GitHub.com Fallback** ⚠️