• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

go 私有结构体 私有方法 映射

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
  1. 通过go:linkname的方式把方法init11映射出来
  2. 通过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,
	))
}

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
新购入希捷FreeAgent Go 移动硬盘发布时间:2022-07-10
下一篇:
Go - 切片(Slice)发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap