¿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.


77
GoPaquetes predeterminados golang.org/pkg
— Arslanbekov

¿Hay una función como la isStandardPackage(importPath string) boolque puedo usar?
— 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
}

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

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í.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.