go中的os.Getenv(""),得不到自定义环境变量

问题描述

os.Getenv("GOPATH")获取不到,但是os.Getenv("HOME")可以正常得到

问题出现的环境背景及自己尝试过哪些方法

在终端中,ech $GOPATH正常输出,GOPATH变量写在了~/.bashrc文件中,os.Getenv("GOPATH")获取不到
后来尝试把GOPATH变量写在~/.profile, /etc/profile, /etc/environment中,都不行
os.Getenv("")中,HOME、PATH这些变量能够正常输出,但是自定义的GOPATH、GOROOT都不行

相关代码

main.go:

package main

import (
    "os"
)

func main() {
    println(os.Getenv("HOME"))
    println(os.Getenv("GOPATH"))
}

终端:

zll@loong:~$ echo $GOPATH
/home/zll/go
zll@loong:~/temp$ go run main.go 
/home/zll

zll@loong:~/temp$ 

问题出现的平台版本

Ubuntu18.04
go 1.11.2

额外关联

使用go的第三方工具viper解析环境变量时,同样的只能得到PATH、HOME这些系统变量,自定义得不到。

package main

import (
    "fmt"

    "github.com/spf13/viper"
)

func main() {
    viper.AutomaticEnv()
    if env := viper.Get("GOPATH"); env == nil {
        println("error!")
    } else {
        fmt.Printf("%#v\n", env)
    }
}

结果:

error!

不知道这之间有没有联系?求解答

阅读 38k
3 个回答

终于找到问题出在哪了!!!
写在.bashrc中的环境变量没有用export命令!执行main.go,子shell中,那是肯定获取不到的!当初图省事。。。

解决办法:

.bashrc文件中,设置环境变量语句前加上export即可。
另外,对于viper,是按照大写找的,如果环境变量中有小写,是找不到的!

跟你编辑起的环境有关系,在终端中运行就可以获取到了

你开了go mod
删掉你项目中 go.mod go.sum就可以了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题