Чи можу я перерахувати всі стандартні пакети Go?


186

Чи є спосіб перейти до переліку всіх стандартних / вбудованих пакетів (тобто пакетів, які встановлюються з установкою Go)?

У мене є список пакунків і я хочу розібратися, які пакунки є стандартними.


7
GoПакети за замовчуванням golang.org/pkg
Арсланбеков

Чи є така функція, isStandardPackage(importPath string) boolяку я можу використовувати?
Алок Кумар Сінгх

1
це можна використовувати? golang.org/pkg/cmd/go/internal/list ?
Алок Кумар Сінгх

Я думаю, список, щоб показати вам всі встановити пакети.
Арсланбеков

чого ви намагаєтеся досягти тут? Заява про імпорт без a .- це або ваш внутрішній пакет, або частина стандартної бібліотеки.
ifnotak

Відповіді:


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.