在Go中是否有一种方法列出所有标准/内置包(即,与Go安装一起安装的包)?
我有一个包列表,我想找出哪些包是标准的。
如果您想要一个简单的解决方案,您可以检查一个包是否以$GOROOT/pkg的形式存在。所有标准软件包都安装在这里。
使用go list std命令列出标准包。特殊的导入路径std扩展到标准Go库(医生)中的所有包。
go list std
std
执行该命令在Go程序中获取列表:
cmd := exec.Command("go", "list", "std") p, err := cmd.Output() if err != nil { // handle error } stdPkgs = strings.Fields(string(p))
你可以为此使用新的golang.org/x/tools/go/packages。这为go list的大部分内容提供了一个编程接口:
golang.org/x/tools/go/packages
go list
package main import ( "fmt" "golang.org/x/tools/go/packages" ) func main() { pkgs, err := packages.Load(nil, "std") if err != nil { panic(err) } fmt.Println(pkgs) // Output: [archive/tar archive/zip bufio bytes compress/bzip2 ... ] }
要获得isStandardPackage(),可以将它存储在映射中,如下所示:
isStandardPackage()
package main import ( "fmt" "golang.org/x/tools/go/packages" ) var standardPackages = make(map[string]struct{}) func init() { pkgs, err := packages.Load(nil, "std") if err != nil { panic(err) } for _, p := range pkgs { standardPackages[p.PkgPath] = struct{}{} } } func isStandardPackage(pkg string) bool { _, ok := standardPackages[pkg] return ok } func main() { fmt.Println(isStandardPackage("fmt")) // true fmt.Println(isStandardPackage("nope")) // false }