求推荐 go 的 web 框架,要求是能实现依赖注入的相关玩法

2021-05-17 11:22:47 +08:00
 chogath

类比:

  1. java 之 spring boot
  2. typescript 之 nest.js
5338 次点击
所在节点    程序员
41 条回复
chogath
2021-05-17 16:20:14 +08:00
@king888 好嘞
king888
2021-05-17 16:22:40 +08:00
@chogath reflect 包用熟悉点,自己也可也搞个依赖注入,容器这个实现不难
chogath
2021-05-17 16:29:26 +08:00
@king888 是,现有的包够用了,功能都可以自己搭。但是并非是最佳实践。说白了大家也都还在探索中。。
lgpqdwjh
2021-05-17 16:34:47 +08:00
windyboy
2021-05-17 17:06:10 +08:00
善意提醒,不需要玩 go web 的时候用 spring 的思想
zjsxwc
2021-05-17 17:10:59 +08:00
@zjsxwc
这个依赖注入容器更简单直观,和 requirejs 一样的注入方式

https://github.com/golobby/container
zoharSoul
2021-05-17 18:09:46 +08:00
@windyboy #25 依赖注入什么时候是 spring 的思想了...
ReferenceE
2021-05-17 18:10:28 +08:00
BeautifulSoap
2021-05-17 19:29:53 +08:00
DI 框架并不算是 spring 思维,作为减轻开发时心智负担的工具,DI 是真的挺重要的。如果真不重要的话 google 官方也不会亲自下场写 wire 这种工具了

go 的 DI 目前用过觉得靠谱的 DI 框架有两个:

1. wire 谷歌官方的 DI 工具。因为其他的 DI 库基本都是基于反射,性能不行,所以谷歌自己写了个这个基于代码生成的 DI,没有任何性能损失。wire 应该是目前 go 语言中关于 DI 最知名用的最广的一个工具了吧。但是问题在于,wire 是基于代码生成的,所以意味着每次你改动依赖都必须重新生成代码,虽然可以用 go generate,但还是挺麻烦的,尤其有时候你自己都不知道改了依赖,忘了生成代码程序就会出错(当然挺多错误能在编译阶段发现也算是个优点)

2. https://github.com/uber-go/dig Uber 的基于反射的 DI 。好处自然是动态 DI,不用总生成代码,但因为基于反射,性能不行,所以 Uber 官方也建议只在 app 初始化的时候使用。目前项目里用的就是 dig,在初始化和测试的时候用 dig 做依赖注入,非常舒服
BeautifulSoap
2021-05-17 19:36:29 +08:00
@BeautifulSoap 再补个 wire 的问题。因为 wire 是代码生成,所以团队开发的时候,自动生成的代码经常(是的,经常)出现 git 的代码合并冲突。我加了依赖,同事加了依赖,即便这两个依赖毫无关系也不对之前的代码有影响,生成的 wire_gen.go 也非常大的几率会合并失败。最终就是总要等一个人合并完成之后,再引入新代码,再生成一遍。真的是不厌其烦。当然一个解决办法就是彻底不提交 wire_gen.go ,每次测试或编译的时候执行 go generate 再生成临时的 wire_gen.go
beidounanxizi
2021-05-17 22:13:56 +08:00
JAVA 写多了 就有这个问题
觉得 aop ioc di 很重要
能把 JAVA 从一开始写好的人 少之又少

既然写 go 建议多看看 go 吧
fxjson
2021-05-18 08:00:42 +08:00
借楼问下各位,go log 里面添加 request id 怎么搞,包括 service 日志,gorm 日志等,不想 service,dao 层参数都加 Context 传递
102400
2021-05-18 10:55:28 +08:00
@fxjson 中间件啊,在 Logger 中间件前面放个 SetRequestID
chogath
2021-05-18 10:58:02 +08:00
@fxjson 切面,interceptor 里实现
joesonw
2021-05-18 12:47:57 +08:00
https://github.com/go-macaron/macaron 可以动态注入 (反射).
joesonw
2021-05-18 12:48:45 +08:00
@BeautifulSoap https://github.com/uber-go/fx, 在 dig 基础上包了一层, 用起来更爽.
x940727
2021-05-18 14:59:11 +08:00
@beidounanxizi 这和什么语言无关,这和项目大小有关……你自己看看 kubernetes 有没有类似 spring 的容器对象?
beidounanxizi
2021-05-18 18:20:51 +08:00
@x940727 K8S 不太了解 不过好奇 你能给个具体例子么 ?
x940727
2021-05-18 19:30:14 +08:00
staging/src/k8s.io/cloud-provider/app/controllermanager.go 比如这个像不像 ServletWebServerApplicationContext?
staging/src/k8s.io/controller-manager/app/controllercontext.go 比如这个像不像 AbstractApplicationContext ?
beidounanxizi
2021-05-21 01:07:29 +08:00
@x940727 AOP IOC DI 在你说额的几个 go 这里 如果体现呢?
你觉得这些 context 或者 manager 是软件工程的角色抽象啊
JAVA Spring 的 AOP IOC DI 不知道你理解的是什么意思?
AOP 是面向切面编程,动态 /静态编译 , IOC 是 bean 的注入实例化和管理
都没有用反射, 再多是 function programming

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/777380

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX