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

标签 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){

...

}

最佳答案

They are in the same package.

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

参见 Package Names on the Go Blog获取更多信息。

由于它们在不同的包中,它们只能访问彼此的公共(public)成员和导出方法。你不能在 Go 中给别人的包或接口(interface)打补丁。这是为了将一个包的所有功能都集中在一个地方,而不是远距离操作。

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

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


但我真的认为您需要考虑您的代码是如何安排的。 App 可能不应该由 routes 包定义,它们应该是分开的。相反,Go 更喜欢 has-a 关系。 App 将包含 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!")
}

请注意我们是如何将责任委托(delegate)给 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
}

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


I was trying to get my http.res & http.req functions in a controllers file.

现在我们已经重新安排了文件结构,您可以这样做了。如果愿意,您可以定义 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!")
}

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

关于go - 将方法添加到不同文件中的 golang 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45379722/

相关文章:

go - 按分钟截断持续时间

struct - 如果结构 A 嵌入到 B 中,A 上的方法可以访问 B 的方法和字段吗?

javascript - 在Javascript中,为什么要用函数来制作对象呢?

python - 重命名外部模块类方法

c - 初始化二维数组是否适合将连续整数映射到 C 中的字符串?

go - 如何用GO语言创建持久的cassandra连接?

java - 如何从主类 java 调用另一个类中的方法

c - 为什么结构体多了 3 个字节?可以去掉吗?

c - 删除记录二进制文件c

Go range over channel 死锁问题,我应该关闭 channel 吗?