myConn和Conn其实是在不同的包里,所以想通过unsafe或者reflect获取myConn未导出的c
第一个方法是符合预期,
不知道为什么第二种方法不行
package main
import (
"fmt"
"reflect"
"unsafe"
)
type MyConn struct {
name string
c *Conn
}
func (c *MyConn) GetName() string {
return c.GetName()
}
type Conn struct {
name string
}
func (c *Conn) GetName() string {
return c.name
}
func (c *Conn) Println() {
fmt.Println(c.name)
}
func main() {
myConn := &MyConn{
name: "myConn's name",
c: &Conn{
name: "1",
},
}
myConn.c.name = "c's name method-1"
connrv := reflect.ValueOf(myConn).Elem().FieldByName("c").Elem()
conn := (*Conn)(unsafe.Pointer(connrv.UnsafeAddr()))
fmt.Println(*conn)
conn.Println() // c's name method-1
myConn.c.name = "c's name method-2"
conn2 := (*Conn)(unsafe.Pointer(uintptr(unsafe.Pointer(myConn)) + unsafe.Offsetof(myConn.c)))
fmt.Println(*conn2)
conn2.Println() // ""
}