如何将方法添加到不同文件的结构中? 这是我到目前为止所尝试过的,但它似乎并没有起作用。
// ./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){
...
}
答案 0 :(得分:10)
它们位于同一个包中。
它们不在同一个包装中。 Go包具有名称和路径。他们都命名为routes
,但他们有不同的路径。实际的包是routes
和controller/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.go
和app/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及其方法,但它们必须属于同一个包(在同一个文件夹中)。