腾讯后端一面

1. 自我介绍。

2. 深入聊聊你的 Go 项目。

3. 为什么要采用三层架构?

4. 你日常用的框架本身能提供分层能力吗?为什么?

5. 讲讲 Gin 框架。

6. Gin 框架里的前缀树是怎么实现的?

7. Gin 是怎么处理请求和中间件的?

8. 在 Controller 层,接口是怎么调用到对应的中间件的?

9. 讲讲 GORM 框架。

10. GORM 里对象和数据库字段的映射底层是怎么实现的?

11. GORM 的标签(tag)底层是怎么处理的?

12. GORM 每次提取标签都需要进行一次反射吗?

13. 讲讲 Go 的协程。

14. 讲讲 GMP 模型里 P 的作用,它是不是必须的?

15. GMP 是如何实现高并发的?

16. 假设一个 Goroutine 跑的是 CPU 密集型代码,这时候 GMP 还能实现高并发吗?

17. 高并发一般用在哪些场景?

18. IO 请求量大就意味着 CPU 占用率高吗?

19. Go 里的 channel 是什么?

20. Channel 是在用户态还是内核态实现的?

21. 如果一个 Goroutine 被阻塞了,由谁来唤醒它?

22. 手撕:在排序数组中查找元素的第一个和最后一个位置。

全部评论

相关推荐

1.图文上传流程2.如何解决图片上传的负载3.不同文件预览的挑战4.讲一下自定义hook5.讲一下Vue2 和vue3 的差异6.vue3解决了vue2的什么问题7.react对比vue的差异8.了解性能优化,在网络层面讲一下优化9.301 和 302区别10.浏览器缓存的策略11.具体是怎么触发缓存12.css的动画中,给一个元素写一个动画,又给它绑定了js点击事件,会生效吗13.反过来,js的代码会不会影响css14.盒子模型,width:100 padding:100 宽度是多少手撕:对于一个数组(长度>=3)进行乱序排序,要求每个元素不会落到原来位置,且落到其他位置的概率相同:function derangementShuffle(arr) {const n = arr.length;// 复制数组,防止修改原数组const shuffledArr = [...arr];// 1. 使用 Fisher-Yates 洗牌算法进行初步打乱for (let i = n - 1; i > 0; i--) {const j = Math.floor(Math.random() * (i + 1));[shuffledArr[i], shuffledArr[j]] = [shuffledArr[j], shuffledArr[i]];}// 2. 检查并纠正还在原位的元素for (let i = 0; i < n; i++) {// 如果当前元素还在原位,需要进行交换if (shuffledArr[i] === arr[i]) {let j = (i + 1) % n; // 从下一个位置开始找// 找到一个可以交换的元素while (shuffledArr[j] === arr[j] && j !== i) {j = (j + 1) % n;}// 进行交换[shuffledArr[i], shuffledArr[j]] = [shuffledArr[j], shuffledArr[i]];}}return shuffledArr;}// 示例const originalArr = [1, 2, 3, 4, 5];const derangedArr = derangementShuffle(originalArr);追问:这段代码的时间复杂度是多少反问:1.业务2.几面
查看15道真题和解析
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务