【问题标题】:How in Golang use struct in other package file?Golang 如何在其他包文件中使用结构?
【发布时间】: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

ma​​in.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


【解决方案1】:

嗯,最后我决定重新设计项目结构。

main.go
routes
    routes.go
controllers
    factors.go
models
    factors.go

ma​​in.go

import (
    "your_project_name/routes"
)

func main()  {
    // code
    router := mux.NewRouter()
    routes.Use(router)
    // code
}

routes/routes.go

package routes

import (
    "github.com/gorilla/mux"
    "your_application_name/controllers"
)

func Use(router *mux.Router) {
    router.HandleFunc("/api/factors", controllers.GetFactors).Methods("GET")
}

controllers/factors.go

package controllers

var GetFactors = func(res http.ResponseWriter, req *http.Request) {
    // code
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2013-10-03
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多