【问题标题】:Can I list all standard Go packages?我可以列出所有标准的 Go 包吗?
【发布时间】:2019-09-12 09:49:10
【问题描述】:

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

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

【问题讨论】:

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

标签: go go-packages


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    使用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】:

      您可以为此使用新的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
      }
      

      【讨论】:

      猜你喜欢
      • 2020-02-13
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 2013-01-26
      • 2020-08-14
      • 1970-01-01
      相关资源
      最近更新 更多