在GO中设计MVC架构
因此,在Go中设计MVC架构时,我遇到了这个问题。 我在设置模块中创建了一个settings.go文件,其中包含以下内容:在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") } 这个想法是每次
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调用。我现在面临的问题是我该怎么做
为了在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库自动处理连接池