如何从代码中获取当前的GOPATH

时间:2015-09-18 10:29:20

标签: go

如何从代码块中获取当前GOPATH

runtime只有GOROOT

// GOROOT returns the root of the Go tree.
// It uses the GOROOT environment variable, if set,
// or else the root used during the Go build.
func GOROOT() string {
    s := gogetenv("GOROOT")
    if s != "" {
        return s
    }
    return defaultGoroot
}

我可以制作一个GOROOT替换为GOPATH的函数,但是有没有这个版本?

4 个答案:

答案 0 :(得分:17)

使用os.Getenv

来自docs:

  

Getenv检索由。命名的环境变量的值   键。它返回值,如果变量不是,则为空   本。

示例:

package main

import (
    "fmt"
    "os"
    )

func main() {
    fmt.Println(os.Getenv("GOPATH"))
}

Go 1.8 +的更新

Go 1.8具有通过go / build导出的默认GOPATH:

package main

import (
    "fmt"
    "go/build"
    "os"
)

func main() {
    gopath := os.Getenv("GOPATH")
    if gopath == "" {
        gopath = build.Default.GOPATH
    }
    fmt.Println(gopath)
}

答案 1 :(得分:8)

您应该使用go/build包。

package main

import (
    "fmt"
    "go/build"
)

func main() {
    fmt.Println(build.Default.GOPATH)
}

答案 2 :(得分:1)

从Go 1.8开始,有一个default GOPATH

  

GOPATH环境变量指定您的位置   工作区。它默认为您家中名为go的目录   目录,因此在Unix上为$HOME/go,在计划9上为$home/go,以及   Windows上%USERPROFILE%\go(通常为C:\Users\YourName\go)。

这意味着GOPATH环境变量不一定特别设置为任何内容。

您仍然可以使用os.Getenv来获取值,但是如果未设置该值,则需要确保使用特定于plattform的默认值,例如使用mitchellh/go-homedir

package main

import (
        "fmt"
        "log"
        "os"

        "github.com/mitchellh/go-homedir"
)

func main() {
        p, err := gopath()
        if err != nil {
                log.Fatalf("Error finding GOPATH: %v", err)
        }

        fmt.Println(p)
}

func gopath() (string, error) {
        s := os.Getenv("GOPATH")
        if s != "" {
                return s, nil
        }
        return homedir.Expand("~/go")
}

答案 3 :(得分:1)

我今天正在搞这个问题,因为我正在努力,这比我想象的更烦人。最后,在我做的各种测试中,这似乎对我有用(不是'严格的'测试)。

goPath := strings.Split(os.Getenv("GOPATH"), string(os.PathListSeparator))
if len(goPath) == 0 {
    goPath = append(goPath, build.Default.GOPATH)
} else if goPath[0] == "" {
    goPath[0] = build.Default.GOPATH
}

请注意,如果GOPATH上列出了多条路径,我决定只使用第一条路径,因为我怀疑很少会列出超过1条路径,第一条路径是go get放置源路径(我猜)。此代码也不考虑路径是否有效。

另请注意,要在获取GOPATH后构建文件路径,我必须使用path/filepath.Join()而不是path.Join()。前者将在Windows上使用\,如果第一个arg包含\,和/或其他。虽然窗口显然可以接受/用于路径,但是我的所有PATH和类似GOPATH的环境变量都是用普通的窗口编写的。 path.Join()使用/,生成无效路径。