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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.