为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕的地8271018 2021-11-08 16:05:39
如何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,但是否有内置函数?
查看完整描述

3 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

使用os.Getenv


从文档:


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)

}


查看完整回答
反对 回复 2021-11-08
?
萧十郎

TA贡献1815条经验 获得超12个赞

您应该使用go/build包。


package main


import (

    "fmt"

    "go/build"

)


func main() {

    fmt.Println(build.Default.GOPATH)

}


查看完整回答
反对 回复 2021-11-08
?
12345678_0001

TA贡献1802条经验 获得超5个赞

我今天因为我正在做的事情而搞砸了这件事,这比我预期的更烦人。最后,这在我对其进行的各种测试中似乎对我有用(不是“严格的”测试)。


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()not path.Join()。如果第一个 arg 包含 \,则前者将在 Windows 上使用 \,而 / 则用于其他参数。尽管 windows 显然可以接受 / for 路径,但我所有的 PATH 和 GOPATH-like 环境变量都是用 windows 的普通 \ 编写的。path.Join()使用 /,产生无效路径。


查看完整回答
反对 回复 2021-11-08
  • 3 回答
  • 0 关注
  • 389 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信