3 回答
TA贡献1875条经验 获得超3个赞
这取决于你自己的风格和规则,在我公司,我们是这样开发项目的:
配置由环境变量决定,因此我们有一个
company/envs/project.sh
文件,必须在服务之前对其进行评估(在图像中的项目之外)。我们添加一个
zscripts
包含所有额外脚本的文件夹,例如添加用户或发布帖子。仅用于调试建议。数据模型(实体)位于名为
project/models
.所有控制器和视图(HTML 模板)都归类为“应用程序”或“模块”。我们使用REST路径为主要组分隔符,所以路径
/dogs
去包装project/apps/dogs
和/cats
到project/apps/cats
。管理器位于项目根目录下的单独包中
project/manager
。静态文件(.css、.png、.js 等)位于
project/static/[app/]
. 有时需要具有可选[app/]
文件夹,但仅当两个应用程序具有仪表板或文件名冲突时才会发生。大多数情况下您不需要使用[app/]
静态资源。
经理
我们称之为管理器,一个包含帮助应用程序执行其任务的纯函数的包,例如数据库、缓存、S3 存储等。我们package.Startup()
在开始侦听之前初始化每个管理器调用,并package.Finalize()
在程序中断时完成调用。
经理的一个例子可能是project/cache/cache.go
:
type Config struct {
RedisURL string `envconfig:"redis_url"`
}
var config Config
var client *redis.Client
func Startup(c Config) error {
config = c
client, err := redis.Dial(c.RedisURL)
return err
}
func Set(k,v string) error {
return client.Set(k, v)
}
在 main.go(或 your_thing_test.go)中:
var spec cache.Config
envconfig.Process("project", &spec)
cache.Startup(spec)
在应用程序(或模块)中:
func SetCacheHandler(_ http.ResponseWriter, _ *http.Request){
cache.Set("this", "rocks")
}
模块
模块是与其他模块隔离的视图和控制器的容器,使用我们的配置,我建议不要在模块之间创建依赖项。模块也称为应用程序。
每个模块都使用路由器、子路由器或您的框架提供的内容来配置其路由,例如 (file project/apps/dogs/configure.go):
func Configure(e *echo.Echo) {
e.Get("/dogs", List)
}
然后,所有处理程序都住在project/apps/dogs/handlers.go:
// List outputs a dog list of all stored specimen.
func List(c *echo.Context) error {
// Note the use of models.Xyz
var res := make([]models.Dog, 0) // A little trick to not return nil.
err := store.FindAll("dogs", nil, &res) // Call manager to find all dogs.
// handle error ...
return c.JSON(200, res) // Output the dogs.
}
最后,您在主(或测试)中配置应用程序:
e := echo.New()
dogs.Configure(e)
// more apps
e.Run(":8080")
注意:对于视图,您可以将它们添加到project/apps/<name>/views文件夹并使用相同的功能对其进行配置。
其他
有时我们还会添加一个project/constants和一个project/utils包。
这是它的样子:
请注意,在上面的示例中,templates
与应用程序分开,那是因为它是占位符,目录为空。
希望它有用。来自墨西哥的问候:D。
TA贡献1820条经验 获得超10个赞
我已经在 golang 中构建 Web API 有一段时间了。
你必须做一些研究,但我可以给你一些起点:
使用 Go 构建 Web 应用程序-- 电子书
github.com/julienschmidt/httprouter——用于路由地址
github.com/unrolled/render/——用于渲染各种形式的响应(JSON、HTML 等)
github.com/dgrijalva/jwt-go -- JSON 网络令牌
www.gorillatoolkit.org/pkg/sessions -- 会话管理
以及一些事情最终如何协同工作的参考:
Go Web API Repo -- 个人项目
- 3 回答
- 0 关注
- 199 浏览
添加回答
举报