Kann ich alle Standard-Go-Pakete auflisten?

186

Gibt es in Go eine Möglichkeit, alle Standard- / integrierten Pakete aufzulisten (dh die Pakete, die mit einer Go-Installation installiert werden)?

Ich habe eine Liste von Paketen und möchte herausfinden, welche Pakete Standard sind.

Alok Kumar Singh
quelle
7
GoStandardpakete golang.org/pkg
Arslanbekov
Gibt es eine Funktion, isStandardPackage(importPath string) booldie ich verwenden kann?
Alok Kumar Singh
1
kann dies verwendet werden? golang.org/pkg/cmd/go/internal/list ?
Alok Kumar Singh
Ich denke Liste, um Ihnen alle Installationspakete zu zeigen.
Arslanbekov
Was versuchst du hier zu erreichen? Eine Importanweisung ohne a .ist entweder ein eigenes internes Paket oder Teil der Standardbibliothek.
ifnotak

Antworten:

49

Sie können das Neue golang.org/x/tools/go/packagesdafür verwenden. Dies bietet eine programmatische Schnittstelle für die meisten von 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 ... ]
}

Um eine zu erhalten isStandardPackage(), können Sie sie wie folgt in einer Karte speichern:

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
quelle
Sofort gesucht, woher kommt okund diesen schönen Artikel gefunden. reddit.com/r/golang/comments/35d0b2/about_the_comma_ok_idiom
Insider
2
Der packages.Load(nil, "std")Aufruf führt den go listBefehl aus und analysiert die Ausgabe. Ich stelle dies für andere fest, die möglicherweise auch die falsche Annahme treffen, dass das Paket die Befehlsimplementierung bereitstellt.
iLoveReflection
32

Verwenden Sie den go list stdBefehl, um die Standardpakete aufzulisten. Der spezielle Importpfad wird stdauf alle Pakete in der Standard-Go-Bibliothek ( doc ) erweitert.

Führen Sie diesen Befehl aus, um die Liste in einem Go-Programm abzurufen:

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

Wenn Sie eine einfache Lösung wünschen, können Sie überprüfen, ob ein Paket in $ GOROOT / pkg vorhanden ist. Alle Standardpakete werden hier installiert.

svetha.cvl
quelle