在 GO 中设计 MVC 架构

所以,在用 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 并创建并关闭了数据库会话。


GCT1015
浏览 275回答 3
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) dependingth.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 变量以在整个控制器中使用它。Go 中没有继承。您正在一个名为的包中打开一个数据库连接settings。这可能不是该包的最佳名称。通常,您尝试在 Go 中执行 python/ruby/php。那不会让你走得太远。阅读 Go 文档并学习像 gopher 一样思考 ;)

繁星淼淼

我不完全理解你的意思,但是,如果你只想与所有处理程序共享一个数据库连接,你会做这样的事情: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 库自动处理连接池。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go