我無法用100%的信心回答,但我認爲這在Go中是不可能的,至少完全如上所述。 This discussion is rather old,但我認爲它描述了基本問題 - 只是導入一個包並不能保證包中的任何方法實際上都存在。編譯器實際上試圖從軟件包中刪除每個未使用的函數。因此,如果在另一個包中有一組「Result *」方法,那麼當您調用該程序時,這些方法實際上並不存在,除非它們已被使用。
另外,如果看看runtime reflection library,您會注意到缺少任何形式的包級別分析。
根據您的使用情況,您可能還會做一些事情。如果你只是想靜態地分析你的代碼,你可以分析一個包並獲得全方位的功能delcarations的文件中,就像這樣:
import (
"fmt"
"go/ast"
"go/parser"
"go/token"
"os"
)
const subPackage := "sub"
func main() {
set := token.NewFileSet()
packs, err := parser.ParseDir(set, subPackage, nil, 0)
if err != nil {
fmt.Println("Failed to parse package:", err)
os.Exit(1)
}
funcs := []*ast.FuncDecl{}
for _, pack := range packs {
for _, f := range pack.Files {
for _, d := range f.Decls {
if fn, isFn := d.(*ast.FuncDecl); isFn {
funcs = append(funcs, fn)
}
}
}
}
fmt.Printf("all funcs: %+v\n", funcs)
}
這將讓你在規定的子包的所有功能delcarations爲ast.FuncDecl
。這不是一個可調用的函數;它只是它的源代碼的表示。
如果你想做任何事情就像調用這些函數,我認爲你必須做更復雜的事情。收集完這些功能後,您可以收集它們並輸出一個單獨的文件來調用它們,然後運行生成的文件。
這是不可能的。有關推理,請參見[拆分客戶端/服務器代碼](http://stackoverflow.com/questions/38875016/splitting-client-server-code/38875901#38875901)。 – icza