모든 표준 Go 패키지를 나열 할 수 있습니까?


186

Go에 모든 표준 / 내장 패키지 (즉, Go 설치와 함께 설치된 패키지) 를 나열하는 방법이 있습니까?

패키지 목록이 있으며 어떤 패키지가 표준인지 파악하고 싶습니다.


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

여기서 무엇을 달성하려고합니까? 가없는 import 문 .은 내부 패키지이거나 표준 라이브러리의 일부입니다.
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 ... ]
}

를 얻으려면 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.