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