2017-01-13 23 views
1

如何在golang中列出程序包的公共方法?如何在golang中列出程序包的公共方法

main.go

package main 

func main() { 
// list all public methods in here 
} 

庫/ method.go

package libs 

func Resut1() { 
    fmt.Println("method Result1") 
} 

func Resut2() { 
    fmt.Println("method Result2") 
} 
+1

這是不可能的。有關推理,請參見[拆分客戶端/服務器代碼](http://stackoverflow.com/questions/38875016/splitting-client-server-code/38875901#38875901)。 – icza

回答

-1

如果你談論的是搞清楚了這一點使用命令行,使用go list命令。特別是,從運行開始

go help list 

在您的終端。

如果您的意思是在運行時在您自己的Go代碼中執行此操作,我相信這可以在標準包reflect的幫助下實現。

+0

我的意思是在代碼中顯示完整的指定包公共方法,並且會運行每個方法。謝謝! –

+0

@YingceLiu,啊所以你的問題是所謂的[XY問題](http://meta.stackexchange.com/a/66378)的一個典型案例:不是告訴我們你的*真實問題是什麼,你告訴我們你的嘗試解決方案有什麼問題。請儘量不要在將來重複這個錯誤。 – kostix

3

我無法用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 。這不是一個可調用的函數;它只是它的源代碼的表示。

如果你想做任何事情就像調用這些函數,我認爲你必須做更復雜的事情。收集完這些功能後,您可以收集它們並輸出一個單獨的文件來調用它們,然後運行生成的文件。

相關問題