1.曹大,我一看到接口就脑壳疼。还有那种用type定义和函数的。我该怎么迈过这一道坎?有没有易懂得源码可以step by step?还有那种包了一层结构体的,去适配etcd consoul?包多层结构体看代码看的很迷糊,不清楚包那么多层结构体 好复杂。
- dlv
- goland 的 interface 查看实现功能
- 加日志
2.type HandlerFunc func(wr, *r) 和 type HandlerFunc = func(wr, *r) 什么区别?
- type alias 和 type equality ,后者无法定义方法,equlity的等号两边完全等价
3.nType=catchAll的时候,/users/:name/*any 这个path,any参数接收到的内容gin为什么设计为path的内容;举例:/users/jack/666,any参数被解析为 “/666” 今天下午看到这个不理解,为什么不是 “666”,下午调试看到的
- 得调一下。。。
4.认证放中间件好还是放一个request对象判断好,类似drf就是放request对象判断
- 不太确定…
5.路由那个算法那么快,可以用在别处吗 类似 高并发 ?除了路由,还有哪些场景可以用到。
6.小项目用自带的net http好 还是第三方gin之类的好?
- 用 gin 好一些,中间件可以用,validator 之类的工具,标准库里都没有,自己整合要花点时间
7.中间件那个跟流水线算法好像有点像,那种类似Jenkins pipeline支持编排后执行的不知道怎么个思路实现?
- 有点没看懂。。skip
8.中间件可插可拔,非常方便,感觉有点类似插件的思路,经常看到有些系统支持自定义插件扩展功能。这种不清楚他们是怎么支持插件式扩展的?
- 两方要编译到一起的话:interface,实现你的 interface 就行
- 还有一种方式,interface,但是我可以加载你的动态库
- rpc
9.路由的链式调用和用那个use两种用法,链式调用不清楚怎么实现的?
- 需要看一下《Go 高级编程》的 middleware 部分
- go-chi/chi
10.router的path设计严格遵守restful模式吗 好像还有用那个graphql的?哪种场景用哪种?
- 不太清楚是不是严格,需要找反例
- graphql,相对于 restful,如果我接口获取的字段有变动,不需要后端做任何修改
- {user_id : 1, user_name : alex}, => {user_id : 1, user_name : alex, user_age : 23}
- graphql 前端请求加新字段就行了
- graphql 缺点
- 权限不好控制
- 稳定性不好做,qps 100 -> 每一个请求他的成本完全不一样,比如有的请求一次只返回一个字段,有的请求一次返回 1000 个字段;难以限流
- 公司内部一些比较后台的运营系统,获取数据。
11.刚才讲的测试分身,能稍微演示一下吗?
- test double
- type Duck interface {
- Speak()
- }
- type myD struct {} // test double
- func (m *myD) Speak() {}
- https://github.com/golang/mock
12.感觉周围同事写的代码一塌糊涂,甚至有个女同事老抄我的代码实现怎么搞?
- CR
- golangci-lint
- 评审、设计
- 注释
13.可以讲讲web开发中各层测试的常规套路吗,应该怎么写test
- unit test -> pkg,func
- 模块测试 -> 脚本,集成公司内上线的 CI 系统里
- 集成测试 -> 脚本,数据可能从线上采集下来的全流程的 case,CI 流程里跑(流量回放之类的技术手段
- QA 手动、负责维护自动化的东西
14.validator 能辨别零值和默认值吗?
- 这个和 validator 没关系,主要 Go 语言的类型系统的问题
- int,没有办法区分用户传了0还是用户没有传值;
- int,nil,0
15.validator会不会影响性能?
- 我觉得性能影响比较小
16.曹大,你一天能集中精力几小时写代码?一天写多少算合格?我一般两三小时之后时间再没精神了。
- 四个小时可以;
- 每写三十分钟,摸 15 分钟鱼
17.有没有必要整理一下go的设计模式常用代码,方便业务代码套进去?有资料推荐吗
- 可以看看这个:senghoo/golang-design-pattern: 设计模式 Golang实现-《研磨设计模式》读书笔记 (github.com)
18.Go里有类似 Java Spring 事务管理器吗?
- 不太了解
- tx
19.框架中很多实现都是需要用reflect的,有效率相关的benchmark吗?是否有实现cache反射结果的实现?
- 编码、解码、validate 要用到
- router 不需要,middleware 不需要
- 编解码是反射性能差的重灾区
20.公司框架集成了gin,是不是应该让gin.Context入侵到业务呢?从输入输出层到repo层都有gin.Context,感觉也没啥问题,因为毕竟两三年不会被换掉,确实很方便
- 不应该 gin.Context 入侵业务
- clean architecture,business logic 放在最上层,不应该让外部变动影响到我的业务。
- 做框架切换、换数据库,都不应该改任何业务相关的代码。
21.那个kratos框架怎么样?
- kratos 有很多不错的东西
- v1 有不少从 google sre 里学到的稳定性经验
- v2 还没写完
22.头条魔改net包的那个方案咋样
- 头条方案需要改 runtime,把 epoll_wait 对用户函数的回调插入到 netpoll 流程里。
- syscall.EpollWait 写回调代码的话,执行 reactor 的 goroutine 没有高优先级,所以延迟会大幅上升
- 我在 mosn 里的测试结果是 4c 以下,netpoll 比标准库节省大量内存,且延迟低,1000 qps
- 8c 以上,netpoll 延迟大幅上升。
23.今天讲的内容平时的业务域涉及不到,框架有点没头绪,平时实现后台服务和提供RPC等,可以基于gRPC做validator或interception等吗?
- gRPC 应该本来就有 interceptor 的功能,类似中间件
- pb 里面就可以写一些校验规则,你把 unmarshal 出来的 struct 额外 validate 一次也是可以的
24.手写router需要通过sync.Pool缓存什么数据
- 通过 go test -benchmem 找内存分配位置,然后通过 sync.Pool 做优化
- 直接看 gin 的代码的 sync.Pool
25.httprouer 和 mux 、fasthttp功能基本相似, star也差不多, 能简单的对比下吗
- mux 相比 httprouter 多了正则匹配的功能,性能上肯定也会稍微差一些;但是路由上的性能不是绝对考虑的因素,主要还是功能。
- fasthttp 不是一个 router,fasthttp <-> net/http,fasthttp 对 http 标准的支持不是很全,如果你不是碰到了 http server 的性能问题,也不建议用 fasthttp。
- fasthttp 他的函数签名和 net/http 不一样,给 net/http 用的 router 在 fasthttp 也没有办法直接用,fasthttp 有自己的 router,比如一些 fasthttprouter
26.问个题外的,database/sql 然后各种driver 用_ 方式导入, 这种模式用在业务上是否合适?
- _ 导入是用了 init 函数
- 大量用 init 函数,如果 init 之间有依赖的话,初始化顺序不对,可能程序就启动不了了 => go fmt 当前文件,可能就跑不了了
- 补充一下,同一个包下面的init执行顺序是按照文件名排序的,也会有坑
- https://github.com/leighmcculloch/gochecknoinits
27.对于sdk类型的库,依赖于其它组件,如何测试比较合适,特别是依赖库的版本变化比较大的情况
- anti-corruption-layer
- 回归测试
- v1/v2 能回滚
28.限速有哪个推荐?不清楚什么原理。能不能根据cpu的负载,自动伸缩goroutine的数量?
- https://github.com/juju/ratelimit
- https://github.com/golang/time/tree/master/rate
- https://github.com/uber-go/ratelimit
- https://github.com/alibaba/sentinel-golang,较复杂
29.orm的原理能简单的梳理一下吗?
- reflect tag, sql.Row, set
- sqlx -> sql string -> params, : @ $. identifier
- gorm 我也没太看过,可以问答区看看
30.chi源码感觉有点复杂,能简单梳理一下吗?
- 问答区吧。。。
31.代码中大量使用设计模式,算不算可读性差?
- 如果你的代码确实有很多可能的变化点和需要适配的外部变动,那设计模式是有必要的
- mysql 这类存储基本是不太可能变的
- 适可而止的使用就可以了
32.在写vaildate时如果要校验那种有参数又有上传文件的怎么办?这种结构体怎么定义,有点转不过来
1 | type req struct { |
33.可以讲讲gitlab flow吗 公司一般怎么管理分支的?
- master 不改代码,直接锁定,发布和上线
- dev
- feature-new-register
- fix-20221-dfsfajf
- fork cch/project
- feature, fix 都是从 master checkout -b
- master -> merge request -> CR
- cherry-pick
34.设计模式,在大厂中会要求代码设计符合设计模式么?
- 大厂没人考你设计模式
- 架构合适好用就行了
35.clickhouse一般用什么场景?
- clickhouse,取代 es 做日志存储
- 在线的 olap,取消 es
36.曹大,你把标准库里源码都浏览完了吗?有什么顺序,最佳方式读下去的,要不要从go1.5开始?
- https://github.com/cch123/golang-notes
- 课上 ppt 第一课、内置数据结构也有个比较全的图
37.业务单元测试怎么做好,各层之间定义的interface太大的话,写的东西也不少。还有一个题外话,如果package的名字叫user,测试的文件也叫user还是叫user_test呢,package的名字不是文件的名字
- 个人经验不是特别多
38.interface套多层这种代码,读起来好难受,一般什么场景会出现这种设计?
- 为了灵活,interface 就是会特别多
- 借助 ide 和 debugger 看
39.函数体用汇编为什么会提高效率?编译成二进制不都是汇编了嘛
- c/c++ 写了一些 json 的解析函数
- clang c/c++ -> asm,-o2 o3,asm optimized,asm : intel -> plan9
- 这样你就有了一个高优化级别的 Go plan9 汇编函数
40.goroutine池一般什么场景用到?高并发那个文章真的可以提升性能吗https://mp.weixin.qq.com/s/-gKgduM8Cw_GGYyzrzSbXw
- https://github.com/valyala/fasthttp/blob/2a6f7db5bbc4d7c11f1ccc0cb827e145b9b7d7ea/workerpool.go#L19
- 减少 goroutine 的创建,销毁成本
- 控制 goroutine 的总数

41.设计一个cmdb用mogodb是不是更好点?因为可能动态给资产加字段。也有可能不同类型的资产导入,不想每次建表去写代码适配了。
- 公司能不能运维好 mongodb
- 其次 mysql 的 json 功能是否已经可以支持你的需求
42.有没有微服务治理、网关做的比较好的公司(可以在线体验一下产品),内部哪些工具已开源的(类似 sentinel),可以拿来鉴赏一下?
- 服务框架里去做这些功能,go-micro,go-zero,kratos v1
- 云原生社区里面的 service mesh 的落地情况,istio,envoy(mosn),魔改
- apisix
43.没有goroutinie池,如果goroutine太多了,岂不是会造成goroutine泄漏?uber有一个检测工具 go.uber.org/goleak ,比如这样的goroutine池的实现 https://github.com/panjf2000/ants 是不是会更好一些?
- goroutine 泄露,比如:goroutine 阻塞在某个 channel 上,永远降不下去,这个叫 goroutine 泄露。
44.为什么go用的plan 9汇编,却可以跑Intel指令集?
- 机器执行的是机器码,plan9 语法、intel 语法是助记符号
45. 没有具体任务目标的时候(为了卷而去看),应当如何着手去剖析框架?是自己写一个demo,然后一路追踪运行流程吗?有没有什么套路?看A问题时候又发现需要B知识,看B又发现C有点迷糊…有点子子孙孙无穷尽也,这个问题有点困惑
- 改代码,加日志,写测试 demo
- delve 做调试
46.. 看 go runtime 的时候大量的汇编代码,其实各种MOV都很好理解的,但是有很多寄存器并不是看得很懂,官方文档里貌似没有详细叙述(AX BX RRR5之类),请问这个应该怎么看呢
- 这些都是通用寄存器,总共就 16 个
- 可以看看王爽的《汇编语言》
- https://githucom/cch123/golang-notes/blob/master/assembly.md
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lihuanjie113@gmail.com