go 私有结构体 私有方法 映射
- 通过go:linkname的方式把方法init11映射出来
- 通过struct的bytes转换的方式把私有的结构体转换成当前包的结构体
a.go
github.com/pubgo/gotests/testmonkey_patch/internal/a1/a.go
type hh struct {
HH string
}
func (t hh) init1() string {
return t.HH
}
func Newhh(s string) *hh {
return &hh{HH: s}
}
main.go
github.com/pubgo/gotests/testmonkey_patch/main.go
import (
"context"
"fmt"
"github.com/pubgo/gotests/testmonkey_patch/internal/a1"
_ "google.golang.org/grpc"
"net"
"reflect"
"unsafe"
_ "unsafe"
)
type hh struct {
HH string
}
//go:linkname init11 github.com/pubgo/gotests/testmonkey_patch/internal/a1.(*hh).init1
func init11(t *hh) string
func main() {
hh := a1.Newhh("sss")
fmt.Println(hh.HH)
dt := MyStructToBytes(unsafe.Pointer(hh))
fmt.Println(BytesToMyStruct(dt).HH)
hh1 := BytesToMyStruct(dt)
fmt.Println(init11(hh1))
}
var sizeOfMyStruct = int(unsafe.Sizeof(hh{}))
func MyStructToBytes(s unsafe.Pointer) []byte {
var x reflect.SliceHeader
x.Len = sizeOfMyStruct
x.Cap = sizeOfMyStruct
x.Data = uintptr(s)
return *(*[]byte)(unsafe.Pointer(&x))
}
func BytesToMyStruct(b []byte) *hh {
return (*hh)(unsafe.Pointer(
(*reflect.SliceHeader)(unsafe.Pointer(&b)).Data,
))
}
作者:百里求一
出处:http://www.cnblogs.com/bergus/
我的语雀: https://www.yuque.com/barry.bai
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署