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.


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
}

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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.