我在GO中创建了一个restful api,每个方法基本上都与数据库交互。我用来打开数据库连接的具体语句是
db,err := sql.Open("postgres", "user=postgres password=password dbname=dbname sslmode=disable")
if err != nil {
log.Fatal(err)
println(err)
}
这很简单,但问题是,一旦我想在该语句中更改某些内容,那么我必须为具有该语句的所有其他方法更改它。我试图做一个依赖注入或那种性质的东西,以便我可以在一个地方有这个声明或值,只是引用它。我得到的导入周期不允许出错Import cycle not allowed。这是我的项目结构
我所做的是在Config.go中我写了这个
package Config
const Connect = "user=postgres password=password dbname=dbname sslmode=disable"
然后在Listings.go中我把这个
package Controllers
import (
"net/http"
"database/sql"
"../Config"
)
func Listing_Expiration(w http.ResponseWriter, r *http.Request) {
db,err := sql.Open("postgres",Config.Connect)
if err != nil {
log.Fatal(err)
println(err)
}
注意我有导入 ../ Config 和 Config.Connect 但是当我编译时我不允许导入循环。我一直试图解决这个问题,但还没有能够解决这个问题。
答案 0 :(得分:5)
我得到了同样的错误。但就我而言,我在文件中导入了包本身。所以你可以检查你是否犯了同样的错误。
答案 1 :(得分:3)
是的,Go不允许循环导入。在您的示例中,您有2个包Config和Controllers。构建代码时,Controllers包需要Config包,然后Config需要控制器,它是无止境的。您应该重构代码以使Config包与控制器分离,并且仅由它使用。此外,您可以制作一些常用的包,导入到Controllers和Config。