ฉันสามารถแสดงรายการแพ็คเกจ Go มาตรฐานทั้งหมดได้หรือไม่


186

จะมีวิธีการในการไปที่รายการทั้งหมดมาตรฐาน / ตัวในแพคเกจ (เช่นแพคเกจที่มาติดตั้งพร้อมกับการติดตั้งไป)?

ฉันมีรายการแพ็คเกจและฉันต้องการทราบว่าแพ็คเกจใดเป็นมาตรฐาน


7
Goแพ็คเกจเริ่มต้นgolang.org/pkg
Arslanbekov

มีฟังก์ชั่นisStandardPackage(importPath string) boolที่ฉันสามารถใช้ได้ไหม?
Alok Kumar Singh เมื่อ

1
ใช้นี่ได้ไหม? golang.org/pkg/cmd/go/internal/list ?
Alok Kumar Singh เมื่อ

ฉันคิดว่ารายการจะแสดงแพ็คเกจการติดตั้งทั้งหมดให้คุณ
Arslanbekov

คุณพยายามทำอะไรที่นี่ คำสั่งการนำเข้าที่ไม่มี a .เป็นแพ็คเกจภายในของคุณเองหรือเป็นส่วนหนึ่งของไลบรารีมาตรฐาน
ifnotak

คำตอบ:


49

คุณสามารถใช้สิ่งใหม่golang.org/x/tools/go/packagesสำหรับสิ่งนี้ นี่เป็นอินเทอร์เฟซแบบเป็นโปรแกรมสำหรับส่วนใหญ่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 ... ]
}

ในการรับ a isStandardPackage()คุณสามารถเก็บไว้ในแผนที่ได้เช่น:

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
}

ค้นหาทันทีที่okมาจากและพบบทความที่ดีนี้ reddit.com/r/golang/comments/35d0b2/about_the_comma_ok_idiom
วงใน

2
การpackages.Load(nil, "std")เรียกใช้งานgo listคำสั่งและแยกวิเคราะห์ผลลัพธ์ ฉันทราบสิ่งนี้สำหรับผู้อื่นที่อาจทำให้สมมติฐานที่ไม่ถูกต้องที่แพคเกจมีการใช้งานคำสั่ง
iLoveReflection

32

ใช้go list stdคำสั่งเพื่อแสดงรายการแพ็กเกจมาตรฐาน เส้นทางการนำเข้าพิเศษstdจะขยายไปยังแพ็คเกจทั้งหมดใน Go มาตรฐาน ( doc )

ดำเนินการคำสั่งนั้นเพื่อรับรายการในโปรแกรม Go:

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

3

หากคุณต้องการโซลูชันที่เรียบง่ายคุณสามารถตรวจสอบว่ามีแพ็คเกจอยู่ใน $ GOROOT / pkg หรือไม่ แพ็คเกจมาตรฐานทั้งหมดได้รับการติดตั้งที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.