如何将变量从init函数(在main.go中)导入go中的其他文件?

时间:2017-02-09 15:22:56

标签: go grpc

这是我的目录结构:

 my_project
      my_api
        main.go
      util_dir
        util.go 

我在main.go内的init函数中传递了一些环境变量,因为我希望每当我的服务启动时都会获取它们。
以下是main.go代码段:

import (
   "net/url"  
   "net"  
) 

func init() {
     ...

     data := url.Values{}
     data.Add("client_id", os.Getenv("CLIENTID"))
     data.Add("client_secret", os.Getenv("CLIENTSECRET"))
}

我想在util.go内做这样的事情:

 import (
      "os"
      "github.com/my_project/my_api"
 ) 

 func validation() {

    data.data.Add("scope", "xyzid")
    data.data.Add("another_secret", "SECRET")

    client := &http.Client{}
    req, err := http.NewRequest("POST", urlStr, bytes.NewBufferString(data.data.Encode()))

 }

我收到import github.com/my_project/my_api is a program, not an importable package的错误。

我想知道这个问题的解决方法是什么?

3 个答案:

答案 0 :(得分:1)

您可以创建一个具有init函数的独立第三个包,它可以导出从环境变量中读取的值。然后,您的主程序包和实用程序目录都可以从中读取。只需导入包,就会读取init函数,因此您可以确保在导入它的任何程序中初始化这些值。

答案 1 :(得分:1)

  

import github.com/my_project/my_api是一个程序,不是可导入的   封装

以上错误清楚地表明你无法导入程序,因为它不是一个程序包。

根据我的理解,您希望在整个软件包中共享您的data变量。

data := url.Values{} // you call this in your main package.

您可以通过在util或其他地方创建另一个包来实现此目的:

package otherPackage

var Data url.Values{}

func InitData(){
   // begin your init data
   Data = url.Values{}
   Data.Add("client_id", os.Getenv("CLIENTID"))
   Data.Add("client_secret", os.Getenv("CLIENTSECRET"))

}

并在您的主程序包中调用此代码:

    package main
    import (
     ....
     "github.com/yourProject/otherPackage"
     ....
    )

    func init(){
        ohterPakcage.InitData()
    }

现在你有一个名为Data的全局变量,你可以在另一个包中调用它,如:

otherPackage.Data // do what you want with that variable.

希望这对你有所帮助。

答案 2 :(得分:0)

import (
   "net/url"  
   "net"  
) 

var Data = init()

func init() url.Values {
     ...

     data := url.Values{}
     data.Add("client_id", os.Getenv("CLIENTID"))
     data.Add("client_secret", os.Getenv("CLIENTSECRET"))
     return data
}

现在在util.go中你可以使用像打击

这样的数据
import (
      "os"
      "github.com/my_project/my_api"
 ) 

 func validation() {

    my_api.Data.Add("scope", "xyzid")
    my_api.Data.Add("another_secret", "SECRET")

    client := &http.Client{}
    req, err := http.NewRequest("POST", urlStr, bytes.NewBufferString(data.data.Encode()))

 }