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.