Могу ли я перечислить все стандартные пакеты Go?

186

Есть ли способ в Go перечислить все стандартные / встроенные пакеты (то есть пакеты, которые устанавливаются вместе с установкой Go)?

У меня есть список пакетов, и я хочу выяснить, какие пакеты являются стандартными.

Алок Кумар Сингх
источник
7
GoПакеты по умолчанию golang.org/pkg
Арсланбеков
Есть ли такая функция, isStandardPackage(importPath string) boolкоторую я могу использовать?
Алок Кумар Сингх,
1
это можно использовать? golang.org/pkg/cmd/go/internal/list ?
Алок Кумар Сингх,
Я думаю, что список, чтобы показать вам все пакеты установки.
Арсланбеков
чего ты здесь пытаешься достичь? Оператор импорта без a .является либо собственным внутренним пакетом, либо частью стандартной библиотеки.
Ифнотак

Ответы:

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_ok_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. Все стандартные пакеты установлены здесь.

svetha.cvl
источник