我可以列出所有标准Go软件包吗?


186

Go中是否可以列出所有标准/内置软件包(即,随Go安装一起安装的软件包)?

我有一个软件包列表,我想弄清楚哪些软件包是标准的。


7
默认Go套餐golang.org/pkg
Arslanbekov

有没有isStandardPackage(importPath string) bool可以使用的功能?
Alok Kumar Singh,


我认为清单可以向您显示所有安装软件包。
Arslanbekov

您想在这里实现什么?不带a的import语句.要么是您自己的内部包,要么是标准库的一部分。
ifnotak

Answers:


49

您可以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()您可以将其存储在地图中,如下所示:

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
}

立即搜索它的ok来源,并找到这篇不错的文章。reddit.com/r/golang/comments/35d0b2/about_the_comma_o​​k_idiom
内部人员

2
packages.Load(nil, "std")调用执行go list命令并解析输出。我为其他人指出了这一点,他们也可能错误地认为该软件包提供了命令实现。
iLoveReflection

32

使用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))

3

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.