栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在运行时发现所有包类型?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在运行时发现所有包类型?

(请参阅底部的2019更新)

警告 :未经测试且骇客。每当发布新版本的Go时可能会中断。

通过对Go的运行时进行一些修改,可以获得运行时知道的所有类型。在您自己的程序包中包含一个小的程序集文件,其中包含:

TEXT yourpackage·typelinks(SB), NOSPLIT, $0-0    JMP reflect·typelinks(SB)

在中

yourpackage
,声明函数原型(无主体):

func typelinks() []*typeDefDummy

除了类型定义:

type typeDefDummy struct {    _      uintptr// padding    _      uint64 // padding    _      [3]uintptr        // padding    StrPtr *string}

然后只需调用typelinks,遍历切片并读取每个StrPtr作为名称。寻找那些以开头的人

yourpackage
。请注意,如果有两个
yourpackage
在不同路径中调用的包,则此方法将不会明确工作。

我可以以某种方式挂接到反射包中以实例化这些名称的新实例吗?

是的,假设

d
是type的值
*typeDefDummy
(请注意星号,非常重要):

t := reflect.TypeOf(*(*interface{})(unsafe.Pointer(&d)))

现在

t
是一个
reflect.Type
可以实例化
reflect.Value
s的值。


编辑:我测试并成功执行了此代码,并已将其作为要点上传。

调整软件包名称,并根据需要添加路径。

更新2019

自从我最初发布此答案以来,发生了很多变化。这是对如何在2019年使用Go 1.11进行相同操作的简短描述。

$GOPATH/src/tl/tl.go

package tlimport (    "unsafe")func Typelinks() (sections []unsafe.Pointer, offset [][]int32) {    return typelinks()}func typelinks() (sections []unsafe.Pointer, offset [][]int32)func Add(p unsafe.Pointer, x uintptr, whySafe string) unsafe.Pointer {    return add(p, x, whySafe)}func add(p unsafe.Pointer, x uintptr, whySafe string) unsafe.Pointer

$GOPATH/src/tl/tl.s

TEXT tl·typelinks(SB), $0-0    JMP reflect·typelinks(SB)TEXT tl·add(SB), $0-0    JMP reflect·add(SB)

main.go

package mainimport (    "fmt"    "reflect"    "tl"    "unsafe")func main() {    sections, offsets := tl.Typelinks()    for i, base := range sections {        for _, offset := range offsets[i] { typeAddr := tl.Add(base, uintptr(offset), "") typ := reflect.TypeOf(*(*interface{})(unsafe.Pointer(&typeAddr))) fmt.Println(typ)        }    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/436184.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号