【发布时间】:2019-02-26 18:57:41
【问题描述】:
我是 Golang 的新手,需要一些帮助。
正如您在下面的代码中看到的,我正在尝试在 Golang 中创建 REST API。我使用mux(Gorilla Mux)和pq(PostgreSQL 驱动程序)作为第三方库。不想使用 ORM。
在application.go 文件中,我有InitializeRoutes 函数,其中包含所有可用路线的列表。 GetFactors 函数处理这些路由之一。我想在另一个名为factors.go 的文件中定义GetFactors 函数逻辑。在factors.go 文件中,我想使用在application.go 中定义的Application 结构。如何正确制作?现在你可以看到它们在不同的包中。这就是为什么factors.go 文件看不到Application 结构。
项目结构:
main.go
application.go
controllers
factors.go
main.go:
package main
func main() {
application := Application{}
application.Initialization()
application.Run("localhost:8000")
}
application.go:
package main
import (
"database/sql"
"github.com/gorilla/mux"
"log"
"net/http"
"rest-api/configurations"
)
type Application struct {
Router *mux.Router
Database *sql.DB
}
func (application *Application) Initialization() {
var err error
application.Database, err = configurations.DatabaseConnection()
if err != nil {
log.Fatal(err)
}
application.Router = mux.NewRouter()
application.Router.StrictSlash(true)
application.InitializeRoutes()
}
func (application *Application) Run(address string) {
log.Fatal(http.ListenAndServe(address, application.Router))
}
func (application *Application) InitializeRoutes() {
application.Router.HandleFunc("/api/factors", application.GetFactors).Methods("GET")
// other code
}
controllers/factors.go:
package controllers
import (
"net/http"
)
func (application *Application) GetFactors(rw http.ResponseWriter, request *http.Request) {
// code
}
【问题讨论】:
-
在 Go 中,你不能在一个包中声明在另一个包中定义的类型的方法。为了能够声明
GetFactors,您必须将Application移动到controllers包中。 -
Go 也不允许循环导入,例如如果包 A 导入包 B,则包 B 无法导入包 A,因此在重构设计时请记住这一点。
-
@mkopriva 我认为这里的主要问题是go无法导入包main,而
Application可以放在main以外的任何包中,然后可以通过导入该包来使用。 -
@NurzhanNogerbek
main包不能被其他包导入。您可以将Application移动到包controllers,或创建另一个包,例如package app。然后导入包控制器或应用程序,您将在其中使用Application -
@NurzhanNogerbek 最好的建议是:从简单开始,不要通过在一些随机概念(如 DRY、SOLID 或 WHATNOT 等)下强制解决方案来使解决方案复杂化,直到您了解如何在 Go 中执行此操作。
标签: go