type cast - hanyong/note GitHub Wiki
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
结论:
- 首先, 不同路径的同包名类名, 反射 reflect 看到的类名一样, 实际上依然是不同的类型。
- 布局相同的结构体, 可以类型强转之后访问, 这是不安全的强转, 与 C 的强转类似。