第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在運行時發(fā)現(xiàn)所有包類型?

如何在運行時發(fā)現(xiàn)所有包類型?

Go
幕布斯7119047 2021-11-01 16:16:06
據(jù)我所知(請參閱此處和此處)在反射包中沒有類型發(fā)現(xiàn)機制,它期望您已經(jīng)擁有要檢查的類型或值的實例。有沒有其他方法可以發(fā)現(xiàn)正在運行的 go 包中的所有導出類型(尤其是結(jié)構(gòu))?這是我希望我擁有的(但它不存在):import "time"import "fmt"func main() {    var types []reflect.Type    types = reflect.DiscoverTypes(time)    fmt.Println(types)}最終目標是能夠發(fā)現(xiàn)滿足特定條件的包的所有結(jié)構(gòu),然后能夠?qū)嵗@些結(jié)構(gòu)的新實例。順便說一句,識別類型的注冊函數(shù)對于我的用例來說不是有效的方法。無論您認為這是一個好主意與否,這就是我想要此功能的原因(因為我知道您會問):我編寫了一個代碼生成實用程序,它加載 go 源文件并構(gòu)建一個 AST 來掃描嵌入指定類型的類型。該實用程序的輸出是一組基于發(fā)現(xiàn)的類型的 go test 函數(shù)。我調(diào)用此實用程序go generate來創(chuàng)建測試函數(shù),然后運行go test以執(zhí)行生成的測試函數(shù)。每次測試更改(或添加新類型)時,我都必須在重新運行之前重新運行 go generate go test。這就是注冊功能不是有效選項的原因。我想避免這go generate一步,但這需要我的實用程序成為由正在運行的包導入的庫。init()對于嵌入預期庫類型的類型,庫代碼需要以某種方式掃描正在運行的命名空間。
查看完整描述

3 回答

?
www說

TA貢獻1775條經(jīng)驗 獲得超8個贊

在 Go 1.5 中,您可以使用新的包類型和導入器來檢查二進制包和源包。例如:


package main


import (

    "fmt"

    "go/importer"

)


func main() {

    pkg, err := importer.Default().Import("time")

    if err != nil {

        fmt.Printf("error: %s\n", err.Error())

        return

    }

    for _, declName := range pkg.Scope().Names() {

        fmt.Println(declName)

    }

}

您可以使用go/build包來提取所有已安裝的包?;蛘吣梢耘渲肔ookup導入器以檢查環(huán)境之外的二進制文件。


在 1.5 之前,唯一沒有黑客的方法是使用包ast來編譯源代碼。


查看完整回答
反對 回復 2021-11-01
?
catspeake

TA貢獻1111條經(jīng)驗 獲得超0個贊

按照您的指示,它今天仍然可以在 1.13.6 上運行。


按照你的方式 tl.s 將是:


TEXT ·typelinks(SB), $0-0

    JMP reflect·typelinks(SB)

是的,沒有包名,也沒有“添加”功能。


然后按照@icio的方式將“添加”功能更改為:


func add(p unsafe.Pointer, x uintptr, whySafe string) unsafe.Pointer {

    return unsafe.Pointer(uintptr(p) + x)

}

然后現(xiàn)在都工作了。:)


查看完整回答
反對 回復 2021-11-01
  • 3 回答
  • 0 關注
  • 212 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號