Posso listar todos os pacotes Go padrão?

186

Existe uma maneira em Ir para listar todos os pacotes padrão / embutidos (ou seja, os pacotes que vêm instalados com a instalação do Go)?

Eu tenho uma lista de pacotes e quero descobrir quais pacotes são padrão.

Alok Kumar Singh
fonte
7
GoPacotes padrão golang.org/pkg
Arslanbekov 23/04/19
Existe uma função como a isStandardPackage(importPath string) boolque eu possa usar?
Alok Kumar Singh
1
isso pode ser usado? golang.org/pkg/cmd/go/internal/list ?
Alok Kumar Singh
Acho que a lista mostra todos os pacotes de instalação.
Arslanbekov 23/04/19
o que você está tentando alcançar aqui? Uma declaração de importação sem a .é um pacote interno próprio ou parte da biblioteca padrão.
ifnotak

Respostas:

49

Você pode usar o novo golang.org/x/tools/go/packagespara isso. Isso fornece uma interface programática para a maioria dos 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 obter um, isStandardPackage()você pode armazená-lo em um mapa, da seguinte forma:

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
fonte
Pesquisou imediatamente de onde okvem e encontrou este belo artigo. reddit.com/r/golang/comments/35d0b2/about_the_comma_ok_idiom
insider
2
A packages.Load(nil, "std")chamada executa o go listcomando e analisa a saída. Observo isso para outras pessoas que também podem supor incorretamente que o pacote fornece a implementação do comando.
iLoveReflection
32

Use o go list stdcomando para listar os pacotes padrão. O caminho de importação especial se stdexpande para todos os pacotes na biblioteca Go padrão ( doc ).

Execute esse comando para obter a lista em um programa Go:

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

Se você quiser uma solução simples, poderá verificar se um pacote está presente no $ GOROOT / pkg. Todos os pacotes padrão estão instalados aqui.

svetha.cvl
fonte