Есть ли способ в Go перечислить все стандартные/встроенные пакеты (то есть пакеты, которые устанавливаются вместе с установкой GoLang)?
У меня есть список пакетов, и я хочу выяснить, какие пакеты являются стандартными.
Есть ли способ в Go перечислить все стандартные/встроенные пакеты (то есть пакеты, которые устанавливаются вместе с установкой GoLang)?
У меня есть список пакетов, и я хочу выяснить, какие пакеты являются стандартными.
Для этого вы можете использовать новый 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
}
Используйте команду 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. Все стандартные пакеты установлены здесь.