在golang中, 我们通常使用os包来获取环境变量,如:
os.Getenv()
os.LookupEnv()
等。
但如果我们使用goland编译器,在编译是,这时操作环境变量,会发现os包读取到的环境变量值不变:
新增后,读到的值还是空值;
修改后,读到的还是修改前的值。
排查了好久,才发现一些问题:
goland在启动时,会加载环境变量,并在运行时缓存这些变量,导致在系统上操作缓存变更后,os包读到值不会变。
且,重启某个项目是无效的,需要关闭所有项目,把goland都关闭后,重新打开,才能生效。
但这个,其实很麻烦,每次一修改,就需要重启所有项目。
我只找到一个不是办法的办法,就是当你需要修改某个项目的环境变更且不想关闭其他项目时,可以在该项目启动的代码,或是新增一个临时项目,执行:
os.Setenv()
或
syscall.SetEnvironmentVariable()
去更新环境变量,然后再去掉代码(是有点麻烦)。
os.Setenv():只能单次生效
syscall.SetEnvironmentVariable():我还没测试过
我只用过goland编译器,不知道其他编译器会不会出现这种问题,或是哪位大神有其他解决办法,可以发评论告知下!