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.


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
}

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))

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.