1
我無法讓parser.ParseDir返回返回的struct.Imports字段中的任何信息。但parser.ParseFile似乎工作。我寧願使用ParseDir,而不必在每個文件上通過並調用ParseFile。以下是我所嘗試的:無法獲取parser.ParseDir來解析導入語句
package crawlers
import (
"fmt"
"go/parser"
"go/token"
"os"
"path/filepath"
)
type GoImports struct {
//imports []*string
}
//returns fullpaths
func (g *GoImports) Crawl(entry string) ([]*string, error) {
fp, err := filepath.Abs(entry)
if err != nil {
return nil, err
}
info, err := os.Stat(fp)
if err != nil {
return nil, err
}
if !info.IsDir() {
return nil, fmt.Errorf("Entry point should be a path to a directory of a go package.")
}
fset := token.NewFileSet()
//foo, err := parser.ParseDir(fset, fp, nil, parser.ImportsOnly)
//foo, err := parser.ParseDir(fset, "/Users/dowen00/local/go/src/got/crawlers/testdata/barpackage", nil, parser.ImportsOnly)
foo, err := parser.ParseDir(fset, "/Users/dowen00/local/go/src/opscli", func(os.FileInfo) bool { return true }, parser.ImportsOnly)
//_, err = parser.ParseDir(fset, "/Users/dowen00/local/go/src/got/crawlers/testdata", nil, parser.ImportsOnly)
//foo, err := parser.ParseFile(fset, "/Users/dowen00/local/go/src/got/crawlers/testdata/barpackage/bar.go", nil, parser.ImportsOnly)
if err != nil {
return nil, err
}
//fmt.Printf("%c\n", foo)
//fmt.Printf("%c\n", fset)
for k, v := range foo {
//for kv, vv := range v.Imports {
//fmt.Printf("%s: %c\n", kv, vv)
//}
fmt.Printf("%s: %c\n", k, v.Imports)
}
return nil, nil
}
我在做什麼錯?
沒用過解析器包,但有一點我注意到的是,它看起來像的文檔表明,如果你不打算使用你可以設置過濾器,以零它:https://golang.org/pkg/go/parser/#ParseDir。這只是你不必擔心的一件事。 –
跟進;這似乎適用於我,都使用過濾器和沒有;如果你做了k和v的打印,你會看到一張地圖被返回。 –
是的,我看到地圖。但地圖是空的。我肯定會在我嘗試過的每個軟件包上導入內容,這兩個軟件包都包含在軟件包和我自己的軟件包中。在任何情況下,返回的地圖都是空的。直接使用ParseFile時,導入地圖不是空的。 – Dale