Puis-je lister tous les packages Go standard?

186

Existe-t-il un moyen dans Go de répertorier tous les packages standard / intégrés (c'est-à-dire les packages qui sont installés avec une installation Go)?

J'ai une liste de packages et je veux savoir quels packages sont standard.

Alok Kumar Singh
la source
7
GoPaquets par défaut golang.org/pkg
Arslanbekov
Y a-t-il une fonction comme celle isStandardPackage(importPath string) boolque je peux utiliser?
Alok Kumar Singh
1
cela peut-il être utilisé? golang.org/pkg/cmd/go/internal/list ?
Alok Kumar Singh
Je pense que la liste pour vous montrer tous les packages d'installation.
Arslanbekov
qu'essayez-vous de réaliser ici? Une instruction d'importation sans a .est soit un package interne de votre choix, soit une partie de la bibliothèque standard.
ifnotak

Réponses:

49

Vous pouvez utiliser le nouveau golang.org/x/tools/go/packagespour cela. Cela fournit une interface programmatique pour la plupart des 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 ... ]
}

Pour obtenir un, isStandardPackage()vous pouvez le stocker dans une carte, comme ceci:

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
la source
Immédiatement cherché d'où okvient et trouvé ce bel article. reddit.com/r/golang/comments/35d0b2/about_the_comma_ok_idiom
initié
2
L' packages.Load(nil, "std")appel exécute la go listcommande et analyse la sortie. Je note cela pour d'autres qui pourraient également faire l'hypothèse incorrecte que le package fournit l'implémentation de la commande.
iLoveReflection
32

Utilisez la go list stdcommande pour répertorier les packages standard. Le chemin d'importation spécial stds'étend à tous les packages de la bibliothèque Go standard ( doc ).

Exécutez cette commande pour obtenir la liste dans un programme Go:

cmd := exec.Command("go", "list", "std")
p, err := cmd.Output()
if err != nil {
    // handle error
}
stdPkgs = strings.Fields(string(p))
Dessus de muffin
la source
3

Si vous voulez une solution simple, vous pouvez vérifier si un paquet est présent dans $ GOROOT / pkg. Tous les packages standard sont installés ici.

svetha.cvl
la source