为了账号安全,请及时绑定邮箱和手机立即绑定

在 GO 中设计 MVC 架构

在 GO 中设计 MVC 架构

Go
GCT1015 2021-08-23 15:30:54
所以,在用 Go 设计 MVC 架构时,我遇到了这个问题。我在设置模块中创建了一个 settings.go 文件,其中包含以下内容:package settingsimport (    _ "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 并创建并关闭了数据库会话。
查看完整描述

3 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

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

}


查看完整回答
反对 回复 2021-08-23
?
喵喔喔

TA贡献1735条经验 获得超5个赞

一个 API 请求进入MVC的视图

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

每当调用某个控制器时加载此函数。

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

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

Go 中没有继承。

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

通常,您尝试在 Go 中执行 python/ruby/php。那不会让你走得太远。阅读 Go 文档并学习像 gopher 一样思考 ;)


查看完整回答
反对 回复 2021-08-23
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

我不完全理解你的意思,但是,如果你只想与所有处理程序共享一个数据库连接,你会做这样的事情:


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 库自动处理连接池。


查看完整回答
反对 回复 2021-08-23
  • 3 回答
  • 0 关注
  • 274 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信