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

时间:2017-07-28 18:00:56

标签: go methods struct

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

// ./src
package routes

type App struct{

}

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

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

...

}

2 个答案:

答案 0 :(得分:10)

  

它们位于同一个包中。

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

有关详细信息,请参阅Package Names on the Go Blog

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

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

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

但实际上我认为您需要考虑如何安排代码。 App可能不应由routes包定义App,它们应该是分开的。相反,Go更喜欢有关系。 routes.Route将包含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添加路由而不是让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 }

app/controllers.go

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

  

我试图获取我的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.goapp/controllers.go位于同一个包中。它们具有相同的路径和相同的名称。因此App可以向function uploadFile(){ if ($('.file')[1].files.length > 0) { if ($('.file')[1].files.extension == '.png') { $('#publishersharebutton').trigger('click'); } else { alert("Please select file"); } } } 添加方法。

答案 1 :(得分:0)

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