Чи можу я перерахувати всі стандартні пакети 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.