在GO中设计MVC架构

时间:2014-10-08 11:14:05

标签: 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")
}

这个想法是每当API请求进入MVC的视图时加载此db调用。我面临的问题是我如何

  1. 每当完成对某个控制器类的调用时,加载此函数。
  2. 继承db变量以在控制器中使用它。
  3. 为了举例说明Python,我使用了一个BaseController来处理这个问题。我在任何地方继承BaseController,并创建和关闭数据库会话。

3 个答案:

答案 0 :(得分:5)

你正在尝试像Go或Java一样编写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.
}

答案 1 :(得分:3)

  

API请求会进入MVC的视图

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

  

只要调用到某个控制器,就会加载此功能。

实例化类,不调用,Go中没有类。

  

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

Go中没有继承。

您正在名为settings的程序包中打开数据库连接。这可能不是该软件包的最佳名称。

一般来说,你在Go尝试做python / ruby​​ / php。那不会让你走得太远。阅读Go文档并学会像gopher一样思考;)

答案 2 :(得分:0)

我不完全明白你的意思但是,如果你只是想与所有处理程序共享数据库连接,你可以这样做:

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"
)

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