Czy mogę wymienić wszystkie standardowe pakiety Go?

186

Czy w Go można znaleźć listę wszystkich standardowych / wbudowanych pakietów (tj. Pakietów, które są instalowane z instalacją Go)?

Mam listę pakietów i chcę dowiedzieć się, które pakiety są standardowe.

Alok Kumar Singh
źródło
7
Domyślne Gopakiety golang.org/pkg
Arslanbekov
Czy jest jakaś funkcja, isStandardPackage(importPath string) boolktórej mogę użyć?
Alok Kumar Singh,
1
czy można tego użyć? golang.org/pkg/cmd/go/internal/list ?
Alok Kumar Singh,
Myślę, że lista pokazująca wszystkie pakiety instalacyjne.
Arslanbekov
co próbujesz tutaj osiągnąć? Instrukcja importu bez a .jest albo własnym pakietem wewnętrznym, albo częścią standardowej biblioteki.
ifnotak

Odpowiedzi:

49

Możesz do tego użyć nowego golang.org/x/tools/go/packages. Zapewnia to programowy interfejs dla większości 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 ... ]
}

Aby go zdobyć isStandardPackage(), możesz zapisać go na mapie:

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
}
Martin Tournoij
źródło
Natychmiast sprawdziłem, skąd okpochodzi i znalazłem ten fajny artykuł. reddit.com/r/golang/comments/35d0b2/about_the_comma_ok_idiom
insider
2
packages.Load(nil, "std")Wezwanie wykonuje go listpolecenia i przetwarza dane wyjściowe. Zwracam na to uwagę innym, którzy mogą również błędnie założyć, że pakiet zapewnia implementację polecenia.
iLoveReflection
32

Użyj go list stdpolecenia, aby wyświetlić listę standardowych pakietów. Specjalna ścieżka importu stdrozszerza się na wszystkie pakiety w standardowej bibliotece Go ( doc ).

Wykonaj to polecenie, aby uzyskać listę w programie Go:

cmd := exec.Command("go", "list", "std")
p, err := cmd.Output()
if err != nil {
    // handle error
}
stdPkgs = strings.Fields(string(p))
Top Muffin
źródło
3

Jeśli chcesz prostego rozwiązania, możesz sprawdzić, czy pakiet jest obecny w $ GOROOT / pkg. Tutaj są zainstalowane wszystkie standardowe pakiety.

svetha.cvl
źródło