不允许Golang导入周期

use*_*668 3 go

我在GO中创建了一个restful api,每个方法基本上都与数据库交互.我用来打开数据库连接的具体语句是

db,err := sql.Open("postgres", "user=postgres password=password dbname=dbname sslmode=disable")
    if err != nil {
        log.Fatal(err)
        println(err)

    }
Run Code Online (Sandbox Code Playgroud)

这很简单,但问题是,一旦我想在该语句中更改某些内容,那么我必须为具有该语句的所有其他方法更改它.我试图做一个依赖注入或那种性质的东西,以便我可以在一个地方有这个声明或值,只是引用它.我得到一个导入周期不允许错误,但不允许导入周期.这是我的项目结构

在此输入图像描述

我所做的是在Config.go中我写了这个

package Config

const Connect  = "user=postgres password=password dbname=dbname sslmode=disable"
Run Code Online (Sandbox Code Playgroud)

然后在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)

}
Run Code Online (Sandbox Code Playgroud)

注意我有导入../Config和Config.Connect但是当我编译时,我得到导入循环不允许.我一直试图解决这个问题,但一直无法解决.

Ale*_*tau 9

是的,Go 不允许循环导入。在您的示例中,您有 2 个包配置和控制器。当你构建代码时,Controllers 包需要 Config 包,然后 Config 需要 Controllers,它是无止境的。您应该重构您的代码,使 Config 包与 Controllers 分离,并且仅供其使用。此外,您可以制作一些通用包,导入到控制器和配置中。


Vit*_*ati 5

我得到了同样的错误.但就我而言,我在文件中导入了包本身.所以你可以检查你是否犯了同样的错误.