Bisakah saya mendaftar semua paket Go standar?

186

Apakah ada cara di Go to list semua paket standar / built-in (yaitu, paket yang datang diinstal dengan instalasi Go)?

Saya memiliki daftar paket dan saya ingin mencari tahu paket mana yang standar.

Alok Kumar Singh
sumber
7
GoPaket default golang.org/pkg
Arslanbekov
Apakah ada fungsi isStandardPackage(importPath string) boolyang bisa saya gunakan?
Alok Kumar Singh
1
Bisakah ini digunakan? golang.org/pkg/cmd/go/internal/list ?
Alok Kumar Singh
Saya pikir daftar untuk menunjukkan kepada Anda semua menginstal paket.
Arslanbekov
apa yang ingin kamu capai di sini? Pernyataan impor tanpa a .merupakan paket internal Anda sendiri atau bagian dari pustaka standar.
ifnotak

Jawaban:

49

Anda dapat menggunakan yang baru golang.org/x/tools/go/packagesuntuk ini. Ini menyediakan antarmuka terprogram untuk sebagian besar 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 ... ]
}

Untuk mendapatkan isStandardPackage()Anda dapat menyimpannya di peta, seperti:

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
sumber
Segera mencari dari mana datangnya okdan menemukan artikel yang bagus ini. reddit.com/r/golang/comments/35d0b2/about_the_comma_ok_idiom
insider
2
The packages.Load(nil, "std")panggilan mengeksekusi go listperintah dan mem-parsing output. Saya perhatikan ini untuk orang lain yang mungkin juga membuat asumsi yang salah bahwa paket menyediakan implementasi perintah.
iLoveReflection
32

Gunakan go list stdperintah untuk mendaftar paket standar. Jalur impor khusus stddiperluas ke semua paket di perpustakaan Go standar ( doc ).

Lakukan perintah itu untuk mendapatkan daftar di program Go:

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

Jika Anda menginginkan solusi sederhana, Anda dapat memeriksa apakah sebuah paket hadir dalam $ GOROOT / pkg. Semua paket standar dipasang di sini.

svetha.cvl
sumber