¿Puedo enumerar todos los paquetes Go estándar?

186

¿Hay alguna manera en Go para enumerar todos los paquetes estándar / integrados (es decir, los paquetes que vienen instalados con una instalación Go)?

Tengo una lista de paquetes y quiero averiguar qué paquetes son estándar.

Alok Kumar Singh
fuente
77
GoPaquetes predeterminados golang.org/pkg
Arslanbekov
¿Hay una función como la isStandardPackage(importPath string) boolque puedo usar?
Alok Kumar Singh
1
¿Se puede usar esto? golang.org/pkg/cmd/go/internal/list ?
Alok Kumar Singh
Creo que la lista para mostrar todos los paquetes de instalación.
Arslanbekov
¿Qué estás tratando de lograr aquí? Una declaración de importación sin un .es un paquete interno propio o una parte de la biblioteca estándar.
ifnotak

Respuestas:

49

Puedes usar lo nuevo golang.org/x/tools/go/packagespara esto. Esto proporciona una interfaz programática para la mayoría de 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 ... ]
}

Para obtener un isStandardPackage()puede almacenarlo en un mapa, así:

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
fuente
Inmediatamente busqué de dónde okviene y encontré este bonito artículo. reddit.com/r/golang/comments/35d0b2/about_the_comma_ok_idiom
insider
2
La packages.Load(nil, "std")llamada ejecuta el go listcomando y analiza la salida. Tomo nota de esto para otros que también pueden suponer incorrectamente que el paquete proporciona la implementación del comando.
iLoveReflection
32

Use el go list stdcomando para enumerar los paquetes estándar. La ruta de importación especial se stdexpande a todos los paquetes en la biblioteca Go estándar ( doc ).

Ejecute ese comando para obtener la lista en un programa Go:

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

Si desea una solución simple, puede verificar si un paquete está presente en $ GOROOT / pkg. Todos los paquetes estándar están instalados aquí.

svetha.cvl
fuente