如何访问私有字段并调用它的公共函数?

问题描述 投票:0回答:0

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() // ""
}
go unsafe
© www.soinside.com 2019 - 2024. All rights reserved.