在Go中是否有一种方法可以列出所有的标准/内置包(即,与Go安装一起安装的包)?

我有一个包列表,我想找出哪些包是标准的。


当前回答

使用go list std命令列出标准包。特殊的导入路径std扩展到标准Go库(doc)中的所有包。

执行该命令在Go程序中获取列表:

cmd := exec.Command("go", "list", "std")
p, err := cmd.Output()
if err != nil {
    // handle error
}
stdPkgs = strings.Fields(string(p))

其他回答

如果您想要一个简单的解决方案,您可以检查一个包是否以$GOROOT/pkg的形式存在。所有标准软件包都安装在这里。

使用go list std命令列出标准包。特殊的导入路径std扩展到标准Go库(doc)中的所有包。

执行该命令在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提供了一个编程接口:

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(),你可以将它存储在map中,如下所示:

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
}