将方法添加到其他文件中的golang结构

将方法添加到其他文件中的golang结构,go,methods,struct,Go,Methods,Struct,如何将方法添加到另一个文件的结构中? 这是我到目前为止尝试过的,但似乎不起作用 // ./src package routes type App struct{ } func (a *App) initializeRoutes() { a.Subrouter.HandleFunc("/products", a.getSomething).Methods("GET") } 您有一个错误,因为您的文件属于不同的包。与一个结构相关的所有内容都必须在同一个包中。 可以在不同的文件中声明st

如何将方法添加到另一个文件的结构中? 这是我到目前为止尝试过的,但似乎不起作用

// ./src
package routes

type App struct{

}

func (a *App) initializeRoutes() {
  a.Subrouter.HandleFunc("/products", a.getSomething).Methods("GET")
}


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


它们在同一个包裹里

它们不在同一个包中。Go包既有名称也有路径。它们都被命名为
路由
,但路径不同。实际的包是
路由
控制器/路由
。结果是子目录是不同的包

有关更多信息,请参阅

由于它们位于不同的包中,因此它们只能访问彼此的公共成员和导出的方法。你不能在Go中对其他人的包或接口进行猴子补丁。这是为了将一个包的所有功能保持在一个地方,而不是远距离操作

你有选择。您可以将
路由
的所有方法放在一个包中。如果它们都属于一起,就没有必要将其拆分为多个文件

如果它们实际上不属于一起,您可以编写一个新结构,其中嵌入路由,并在此结构上定义新方法。然后,您可以访问包装器结构以获取添加的方法,或者访问其嵌入结构以获取
路由
”方法。有关示例,请参见


但实际上,我认为您需要考虑代码是如何安排的。
应用程序
可能不应由
路由
包定义,它们应该是分开的。相反,Go更喜欢有一段感情<代码>应用程序将包含
路由的实例。路由

您应该像这样重新排列代码树:

app/
    app.go
    app_test.go
    routes/
        routes.go
        routes_test.go
请注意,它现在不是全部包含在
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!")
}
请注意,我们是如何将责任委托给
a.routes
而不是让
App
自己做。这避免了将所有功能粉碎成一个巨大的包的愿望<代码>路线。路线将在
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
}
现在所有航线都要担心的是处理航线。它对您的特定应用程序逻辑一无所知


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

现在我们已经重新安排了文件结构,您可以这样做了。如果愿意,您可以定义
应用程序/控制器。转到
组织代码

// src/app/controllers.go
package app

import(
    "fmt"
    "net/http"
)

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

app/app.go
app/controllers.go
在同一个包中。它们具有相同的路径和名称。因此
app/controllers.go
可以向
app
添加方法(…应该是一个.Subrouter.Handle…我是新来的,但我想知道它们是否属于同一个包。是吗?这是关键因素。它们是否在不同的文件中并不重要,但不能将方法添加到不同包中定义的类型。它们在同一个包中。它们在同一个包中。它们在同一个包中。package routes,我仍然收到错误。app/routes/v1/index.go:47:v.getProducts未定义(type*v1没有字段或方法getProducts)请仔细查看(位于同一文件夹中)哦。我现在明白了。谢谢。我正试图将我所有的处理程序都放在一个控制器文件夹中,与它们的功能相关。@JosephPalacio我添加了一个示例,说明如何将处理程序放在它们自己的文件中以供组织使用。谢谢!这真的很有帮助。你应该将此标记为答案。这是非常好的解释和说明埃泰勒德。
// src/app/controllers.go
package app

import(
    "fmt"
    "net/http"
)

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