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.


7
GoPaket default golang.org/pkg
Arslanbekov

Apakah ada fungsi isStandardPackage(importPath string) boolyang bisa saya gunakan?
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
}

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

3

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.