如何从代码块中获取当前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
的函数,但是有没有这个版本?
答案 0 :(得分:17)
来自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()
使用/,生成无效路径。