无法读取go with os.Getenv(“KEY”)中函数外部的环境变量

无法读取go with os.Getenv(“KEY”)中函数外部的环境变量,go,Go,我是一个新手,使用sling对外部服务进行api调用 当我这样做的时候 var api=sling.New().Base(os.Getenv(“Base\u URL”)) 值为“” 但是当我在一个函数中进行同样的调试时 var api = sling.New().Base(os.Getenv("BASE_URL")) // raw url is blank var api2=os.Getenv("BASE_URL") type Params struct{

我是一个新手,使用sling对外部服务进行api调用 当我这样做的时候
var api=sling.New().Base(os.Getenv(“Base\u URL”))
值为“”

但是当我在一个函数中进行同样的调试时

var api = sling.New().Base(os.Getenv("BASE_URL")) // raw url is blank
var api2=os.Getenv("BASE_URL")
type Params struct{
//params defined
}

func GetInfo(){

//params set

log.debug("base url:",os.Getenv("BASE_URL")) // prints "www.example.com/" as set in .env file
log.debug("base url from outside the function :",api2) //also empty
    if _, err := api.New().Get("trailingURL/rest").QueryStruct(params).ReceiveSuccess(response); err != nil || !response.Successful() {
        
        return false
    } // fails as base url is not set

}

我哪里出错了?

调用
os.Getenv
的地方没有区别。在这个基本示例中:

package main

import (
    "fmt"
    "os"
)

var v = os.Getenv("FOO")

func GetInfo() {
    fmt.Println(os.Getenv("FOO"))
}

func main() {
    fmt.Println(v)
    GetInfo()
}
如果使用
FOO=42运行它,那么它将打印42次


在您的代码中,我想说的区别是全局初始化调用
sling.New().Base
,而函数不调用。如果我调试这个,我会在那里寻找不同之处

首先在
api
旁边添加一个
api2
全局:

var api = sling.New().Base(os.Getenv("BASE_URL"))
var api2 = os.Getenv("BASE_URL")

然后打印/记录两者的值,然后查看结果。

ENV变量的值在函数内部或外部都不会变化。您确定
os.Getenv(“BASE\u URL”)
在第一行是空的还是
api
是空的?如果在调用
sling.New().BASE()
之前打印
os.Getenv(“BASE\u URL”)
,您应该会看到该值。我怀疑调用
sling.New().Base()
就是问题所在。@HectorCorrea当我直接初始化变量的值时,这也会失败。全局变量是否在编译时初始化,环境变量是否在编译后加载?按照api2的initialisationvalue顺序的任何想法也可以empty@Lucas:在全局范围(发生在程序初始化时)和调用
GetInfo
的位置之间保持平分。也许这个值是在初始化后由程序本身设置的?GetInfo方法是api的一部分,它反过来调用另一个api,所以我想说调用是在服务器启动并运行之后进行的。我想,在服务器启动后,我们调用一个基于环境加载.env文件的通用方法,但是这些全局变量将在那时被初始化,因此它们持有空白值,我的错。@Lucas:不用担心,我们都去过那里。找到一个“它起作用”的点,另一个“它不起作用”的点,然后在它们之间进行平分,这是一个经过战斗考验的调试策略,它诞生于许多人的努力中:-)很高兴你解决了你的问题