这是我的目录结构:
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
的错误。
我想知道这个问题的解决方法是什么?
答案 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()))
}