因此,在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调用。我面临的问题是我如何
为了举例说明Python,我使用了一个BaseController来处理这个问题。我在任何地方继承BaseController,并创建和关闭数据库会话。
答案 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库自动处理连接池。