gpt4 book ai didi

go - 在Go中分离多个文件和包中的组件

转载 作者:行者123 更新时间:2023-12-01 22:33:52 25 4
gpt4 key购买 nike

在我的原始代码中,所有内容都在包main中定义。我想在另一个名为handlers的程序包中定义其余API。
我是我的原始代码,我有这个

package main

type App struct {
Router *mux.Router
DB *sql.DB
}

func main() {

a.Router = mux.NewRouter()
s := a.Router.PathPrefix("/api/v1").Subrouter()
s.HandleFunc("/something", a.getSomething).Methods("GET")
}

func (a *App) getSomething(w http.ResponseWriter, r *http.Request) {
...
}
我想在另一个软件包上定义所有处理程序,例如 getSomething。但是由于数据库对象,我还需要访问 App
这是可以实现的吗?还是有另一种更好的方法来做到这一点?
目的是要具有类似于此结构的内容:
model (logic and db handling)
handlers (api handlers and calls to the model)
main.go (router config)

最佳答案

您无法访问从其他包导出到主包中的名称。主程序包通常会初始化子系统中使用的所有内容,并将其传递给其他人。因此,做您需要做的一种方法是摆脱App结构,初始化main中的组件,然后将这些组件传递给单独的包。
对于DB,您可能想在使用DB的程序包中设置程序包级变量,或将其传递给在该程序包中调用的函数,然后将其传递给其他函数。
对于路由器,您可能希望将路由器设置在软件包本身中,而不是在main中进行设置,然后从软件包中获取路由器,以便将其传递给需要它的其他软件包。例如,您可以使用handlers.SetupRouter()函数来初始化路由器并返回它,因此可以将其包含在main中以传递给其他软件包。
您也可以像现在一样进行操作:在main中设置路由器。然后,您可以在处理程序包下设置一个包级变量并使用它。

关于go - 在Go中分离多个文件和包中的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62565029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com