在GO中设计MVC架构

在GO中设计MVC架构,go,Go,因此,在Go中设计MVC架构时,我遇到了这个问题。 我在设置模块中创建了一个settings.go文件,其中包含以下内容: package settings import ( _ "github.com/lib/pq" "database/sql" ) func load_db() { db, err := sql.Open("postgres", "user=postgres password=postgres dbname=test_db") } 这个想法是每次

因此,在Go中设计MVC架构时,我遇到了这个问题。 我在设置模块中创建了一个settings.go文件,其中包含以下内容:

package settings

import (
    _ "github.com/lib/pq"
    "database/sql"
)

func load_db() {
    db, err := sql.Open("postgres", "user=postgres password=postgres dbname=test_db")
}
这个想法是每次API请求进入MVC视图时都加载这个db调用。我现在面临的问题是我该怎么做

  • 每当调用某个控制器类时加载此函数
  • 继承db变量以在控制器中使用它
    为了在Python中给出一个示例,我使用了一个BaseController来处理这个问题。我到处都继承BaseController,它创建并关闭db会话。

    您试图像编写Java或Python一样编写Go。去也不是。Go没有类,Go有类型。Go不使用继承,Go使用组合

    如果希望在每次调用另一个函数/方法时调用某个函数/方法,请显式编写代码:

    func (th *BaseThing) Init() {
        th.OpenDB()
        // Your code here.
    }
    
    如果希望多个值共享一个对象,请显式设置它:

    db := NewDB()
    th := NewThing()  // Or th := NewThing(db) depending
    th.DB = db        // on how you design your constructor.
    
    如果要共享此功能,请使用合成:

    type MyThing struct {
        BaseThing
        // Other fields here.
    }
    
    func (th *MyThing) Foo() {
        th.Init() // Same as th.BaseThing.Init(). Opens DB etc.
        // Your code here.
    }
    

    您试图像编写Java或Python一样编写Go。去也不是。Go没有类,Go有类型。Go不使用继承,Go使用组合

    如果希望在每次调用另一个函数/方法时调用某个函数/方法,请显式编写代码:

    func (th *BaseThing) Init() {
        th.OpenDB()
        // Your code here.
    }
    
    如果希望多个值共享一个对象,请显式设置它:

    db := NewDB()
    th := NewThing()  // Or th := NewThing(db) depending
    th.DB = db        // on how you design your constructor.
    
    如果要共享此功能,请使用合成:

    type MyThing struct {
        BaseThing
        // Other fields here.
    }
    
    func (th *MyThing) Foo() {
        th.Init() // Same as th.BaseThing.Init(). Opens DB etc.
        // Your code here.
    }
    
    API请求进入MVC的视图

    在MVC架构中,请求被分派到控制器,而不是视图

    每当对某个控制器类进行调用时加载此函数

    类是实例化的,没有调用,Go中没有类

    继承db变量以在控制器中使用它

    围棋没有继承权

    您正在一个名为
    settings
    的包中打开一个DB连接。这可能不是该软件包的最佳名称

    一般来说,您正在尝试在Go中使用python/ruby/php。那不会让你走多远的。阅读围棋文档,学会像地鼠一样思考;)

    API请求进入MVC的视图

    在MVC架构中,请求被分派到控制器,而不是视图

    每当对某个控制器类进行调用时加载此函数

    类是实例化的,没有调用,Go中没有类

    继承db变量以在控制器中使用它

    围棋没有继承权

    您正在一个名为
    settings
    的包中打开一个DB连接。这可能不是该软件包的最佳名称


    一般来说,您正在尝试在Go中使用python/ruby/php。那不会让你走多远的。阅读围棋文档,学会像地鼠一样思考;)

    我不完全理解你的意思,但是,如果你只想与所有处理程序共享一个db连接,你可以这样做:

    var (
            db *sql.DB
    )
    
    func main() {
            db = newDb(DbConnection)
    
            // handlers here
    }
    
    
    func newDb(connection string) *sql.DB {
            db, err := sql.Open("postgres", connection)
            if err != nil {
                    panic(err)
            }
    
            return db
    }
    
    在设置文件中,您可以有:

    const (
    DbConnection     = "user=postgres password=postgres dbname=test_db"
    )
    

    您的所有处理程序都可以访问数据库上的连接。sql库自动处理连接池。

    我不完全理解您的意思,但是,如果您只想与所有处理程序共享一个db连接,您可以执行以下操作:

    var (
            db *sql.DB
    )
    
    func main() {
            db = newDb(DbConnection)
    
            // handlers here
    }
    
    
    func newDb(connection string) *sql.DB {
            db, err := sql.Open("postgres", connection)
            if err != nil {
                    panic(err)
            }
    
            return db
    }
    
    在设置文件中,您可以有:

    const (
    DbConnection     = "user=postgres password=postgres dbname=test_db"
    )
    
    您的所有处理程序都可以访问数据库上的连接。sql库自动处理连接池