ChatGPT解决这个技术问题 Extra ChatGPT

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

Go 中有没有办法列出所有标准/内置包(即,随 Go 安装一起安装的包)?

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

默认 Gogolang.org/pkg
我可以使用像 isStandardPackage(importPath string) bool 这样的功能吗?
这个可以用吗? golang.org/pkg/cmd/go/internal/list ?
我想列出所有安装包。
你想在这里实现什么?不带 . 的导入语句要么是您自己的内部包,要么是标准库的一部分。

M
Martin Tournoij

您可以为此使用新的 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_ok_idiom
packages.Load(nil, "std") 调用执行 go list 命令并解析输出。我注意到其他人可能也会错误地假设包提供了命令实现。
C
Cerise Limón

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

s
svetha.cvl

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