将方法添加到不同文件中的golang结构

Jos*_*cio 2 methods struct go

如何将方法添加到不同文件的结构中?这是我到目前为止所尝试的但它似乎没有起作用.

// ./src
package routes

type App struct{

}

func (a *App) initializeRoutes() {
  a.Subrouter.HandleFunc("/products", a.getSomething).Methods("GET")
}
Run Code Online (Sandbox Code Playgroud)
// ./src/controller
package routes

func (a *App) getSomething(w http.ResponseWriter, r *http.Request){

...

}
Run Code Online (Sandbox Code Playgroud)

Sch*_*ern 12

它们在同一个包装中.

它们不在同一个包装中.Go包具有名称和路径.它们都被命名,routes但它们有不同的路径.实际的包是routescontroller/routes.结果是子目录是不同的包.

有关详细信息,请参阅Go Blog上的软件包名称.

由于它们位于不同的包中,因此它们只能访问彼此的公共成员和导出的方法.你不能在Go中修补别人的包或界面.这是设计用于将包的所有功能保存在一个地方,而不是远距离动作.

你有选择.您可以将所有方法routes放入单个包中.如果它们都属于一起,则无需将其拆分为多个文件.

如果它们并不真正属于一起,您可以编写一个新的结构,其中嵌入了路径并在其上定义新方法.然后,您可以访问包装器结构以获取添加的方法,或访问其嵌入式结构以获取routes'方法.请参阅此答案以获取示例.


但实际上我认为你需要考虑你的代码是如何安排的.的App可能不应该被定义routes包,它们应该是分开的.相反,Go更喜欢有关系.App将包含一个实例routes.Route.

您将重新排列代码树,如下所示:

app/
    app.go
    app_test.go
    routes/
        routes.go
        routes_test.go
Run Code Online (Sandbox Code Playgroud)

请注意,它不是全部src/包含在它自己的项目目录中.app.go看起来像这样.

// src/app/app.go
package app

import(
    "app/routes"
    "fmt"
    "net/http"
)

type App struct {
    routes routes.Route
}

func (a *App) initializeRoutes() {
    a.routes.AddRoute("/products", a.getSomething)
}

func (a *App) getSomething(w http.ResponseWriter, r *http.Request) {
    fmt.Println("Something!")
}
Run Code Online (Sandbox Code Playgroud)

请注意我们如何将责任委托给添加路线a.routes而不是自己App动手.这避免了将所有功能粉碎成一个巨大包装的愿望.routes.Route将被定义为app/routes/routes.go.

// src/app/routes/routes.go
package routes

import "net/http"

// A type specifying the interface for route handlers.
type RouteHandler func(w http.ResponseWriter, r *http.Request)

type Route struct {
    handlers map[string]RouteHandler
}

func (r *Route) AddRoute(path string, handler RouteHandler) {
    r.handlers[path] = handler
}
Run Code Online (Sandbox Code Playgroud)

现在所有路线都要担心的是处理路线.它对您的特定应用程序逻辑一无所知.


我试图在控制器文件中获取我的http.res和http.req函数.

现在我们已经重新安排了文件结构,你可以这样做.如果您愿意,可以定义app/controllers.go组织代码.

// src/app/controllers.go
package app

import(
    "fmt"
    "net/http"
)

func (a *App) getSomething(w http.ResponseWriter, r *http.Request) {
    fmt.Println("Something!")
}
Run Code Online (Sandbox Code Playgroud)

app/app.go并且app/controllers.go在同一个包装中.它们具有相同的路径和相同的名称.所以app/controllers.go可以添加方法App.


Pav*_*kov 2

由于您的文件属于不同的包,因此出现错误。与一个结构相关的所有内容都必须位于同一个包中。
可以在不同的文件中声明结构及其方法,但它们必须属于同一包(位于同一文件夹中)。