Tôi có thể liệt kê tất cả các gói Go tiêu chuẩn không?


186

Có cách nào trong Go để liệt kê tất cả các gói tiêu chuẩn / tích hợp (nghĩa là các gói được cài đặt với cài đặt Go) không?

Tôi có một danh sách các gói và tôi muốn tìm ra gói nào là chuẩn.


7
GoGói mặc định golang.org/pkg
Arslanbekov

Có một chức năng như isStandardPackage(importPath string) booltôi có thể sử dụng?
Alok Kumar Singh

1
cái này có dùng được không? golang.org/pkg/cmd/go/iternal/list ?
Alok Kumar Singh

Tôi nghĩ rằng danh sách để hiển thị cho bạn tất cả các gói cài đặt.
Arslanbekov

bạn đang cố gắng đạt được điều gì ở đây? Một câu lệnh nhập mà không có .là một gói nội bộ của riêng bạn hoặc là một phần của thư viện chuẩn.
ifnotak

Câu trả lời:


49

Bạn có thể sử dụng cái mới golang.org/x/tools/go/packagescho việc này. Điều này cung cấp một giao diện lập trình cho hầu hết 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 ... ]
}

Để có được một isStandardPackage()bạn có thể lưu trữ nó trong bản đồ, như vậy:

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
}

Ngay lập tức tìm kiếm từ đâu okđến và tìm thấy bài viết tốt đẹp này. reddit.com/r/golang/comments353d0b2/about_the_comma_ok_idiom
người trong cuộc

2
Cuộc packages.Load(nil, "std")gọi thực thi go listlệnh và phân tích cú pháp đầu ra. Tôi lưu ý điều này cho những người khác cũng có thể đưa ra giả định không chính xác rằng gói cung cấp việc thực hiện lệnh.
iLoveReflection

32

Sử dụng go list stdlệnh để liệt kê các gói tiêu chuẩn. Đường dẫn nhập đặc biệt stdmở rộng tới tất cả các gói trong thư viện Go ( doc ) tiêu chuẩn .

Thực thi lệnh đó để lấy danh sách trong chương trình Go:

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

3

Nếu bạn muốn một giải pháp đơn giản, bạn có thể kiểm tra xem một gói có trong $ GOROOT / pkg không. Tất cả các gói tiêu chuẩn được cài đặt ở đây.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.