百度面经

先来看看 职位描述:

  • 工作职责:负责百度文库的服务端研发工作。精心编写核心代码,勇挑关键技术攻关重任。积极参与服务架构设计,独立完成业务需求的精准分析与巧妙设计。致力于现有服务框架的升级、性能优化以及稳定性建设。全力推动技术与产品创新,精心建设良好的技术文档,助力团队明晰需求和技术架构,大幅提高开发效率。
  • 任职资格:计算机或相关专业,本科及以上学历。拥有两年以上 Golang/PHP/Java/Python/C++ 项目开发经验,具备良好的编程习惯熟悉 Linux 操作系统和开发环境,拥有良好的数据结构、算法基础和系统设计能力。熟悉技术领域的通用组件如 Mysql、Redis、Kafka、ElasticSearch 等,在理论研究和实践经验方面造诣颇深,并能成功落地到业务中。熟悉 web service 相关技术,如高并发处理、存储与缓存,RPC、消息队列等技术。支付、会员、文档智能化等系统相关研发设计经验者优先。具备较好的团队合作精神,较强的沟通能力,主动性强,拥有很强的自我驱动力。拥有较好的产品意识,主动关注产品效果并积极推进产品方案的落实与完善。

面试流程

  1. 自我介绍
  2. 技能广度
  • 说明自己掌握多种语言,如Python、Java、Go、C/C++等。
  1. Go逃逸分析逃逸分析是 Go 语言编译器的一项重要优化技术。简单来说,逃逸分析用于确定一个变量的内存分配位置。它会分析变量的作用域和生命周期,来决定是在栈上分配内存还是在堆上分配内存。

为了理解Go 逃逸,我们要来看看变量可能会在哪些情况发生逃逸?

  1. 变量的作用域超出了其所在的函数:比如一个函数返回了一个局部变量的指针,由于函数返回后该局部变量仍然需要被访问,所以它不能在栈上分配,会逃逸到堆上。
func createPointer() *int {    num := 5    return &num}

在这个例子中,num 变量发生了逃逸,因为函数返回了它的指针。

  1. 切片或映射等动态大小的数据结构:当为切片或映射分配内存时,如果其大小在编译时无法确定,那么这些变量可能会逃逸到堆上。
func createSlice() []int {    return []int{1, 2, 3}}
  1. 被全局变量引用:如果一个局部变量被全局变量引用,那么它也可能会逃逸。

我们可以通过 go build -gcflags="-m" 命令来查看编译器的逃逸分析结果。

  1. Gin的http方法怎么实现的路由注册:使用特定的方法来注册不同的路由路径和对应的处理函数。上下文对象(gin.Context):在处理函数中,通过 gin.Context 对象获取请求的相关信息,如请求参数、头部信息等,并设置响应的状态码、数据等。中间件支持:可以在路由处理之前或之后添加中间件来执行一些通用的逻辑,如日志记录、权限验证等。分组路由:可以将相关的路由分组,方便管理和组织。响应处理:设置响应的状态码、返回数据的格式(如 JSON、HTML 等)等等
  2. Gin框架的标签机制json 标签:用于将结构体字段与 JSON 数据进行绑定。uri 标签:用于从 URL 路径中提取参数。binding 标签:用于指定参数的验证规则。form 标签:用于将表单字段与结构体字段进行绑定。
  3. Channel了解吗
  • 内部结构Channel 在内部由一个环形缓冲区和两个等待队列组成。环形缓冲区用于存储发送的数据,当缓冲区满时,发送操作会阻塞,直到有接收操作取出数据腾出空间。两个等待队列分别用于存储因发送或接收操作而阻塞的 goroutine。当相应的条件满足(如缓冲区有空间可发送或有数据可接收),这些 goroutine 会被唤醒并继续执行。
  • 使用场景数据传递与共享任务分发与协调控制并发数量实现信号通知等等

Channel 的实现也说明了通过通信来共享内存

  1. Sync包有哪些东西Mutex(互斥锁):用于保证在同一时刻只有一个 goroutine 可以访问共享资源,防止数据竞争。RWMutex(读写互斥锁):提供了更细粒度的控制,允许多个 goroutine 同时读取共享资源,但在写操作时进行排他锁定。Sync.Map:一种支持并发安全读写的 Map 数据结构,适用于多个 goroutine 同时读写的场景。Sync.Once:确保某个操作只执行一次,常用于初始化只需要执行一次的共享资源。Sync.Pool:对象池,用于复用临时对象,减少内存分配和垃圾回收的开销。等等
  2. HTTP状态码1XX 信息性状态码2XX 成功状态码3XX 重定向状态码4XX 客户端错误状态码5XX 服务器错误状态码、
  3. HTTP状态码499Nginx自定义状态,表示客户端在请求还未完成时关闭了连接。
  4. Redis应用与数据一致性可能会导致数据不一致的情况:并发操作:多个客户端同时对 Redis 中的数据进行读写操作,可能导致数据不一致。数据过期:设置了过期时间的键,如果在过期时间到达之前没有及时更新或处理,可能导致数据不一致。主从复制延迟:在 Redis 的主从架构中,主节点的数据变更需要同步到从节点,如果同步过程存在延迟,可能导致从节点读取到的数据与主节点不一致。解决数据一致性问题的方法:事务:使用一个原子操作,但需要注意的是,Redis 事务不支持回滚操作。乐观锁:可以使用 Redis 的 WATCH 命令实现乐观锁机制。Lua 脚本:多个操作可以用lua脚本
  5. Mysql innodb为什么主键推荐用自增优化 B + 树结构:InnoDB 使用 B + 树来组织数据,自增主键可以使 B + 树的结构更加紧凑和平衡,减少树的深度,从而提高查找、插入和删除操作的性能。减少页分裂:InnoDB 以页为单位存储数据,如果主键不是自增的,插入新数据时可能会导致页的频繁分裂和重组。提高存储和查询性能:自增主键的数据分布更有序,有利于索引的构建和维护。
  6. Mysql删除数据,容量会不会变不会变,因为删除操作只是在数据行上做了删除标记,而不是真正地从物理上删除数据和释放磁盘空间。
  7. Mysql表设计优化策略为字段选择合适的数据类型为字段选择合适的数值合理设置字段属性考虑存储引擎索引优化一些参数优化连接数优化等等
  8. 微服务架构利弊优点:独立部署和扩展灵活的技术选型容错性高职责明确敏捷开发缺点:分布式事务处理困难测试复杂性业务排查问题慢数据一致性
  9. 微服务故障排查技巧利用请求ID链路追踪监控工具日志记录测试环境复现等等
  10. 现场编码练习完成字符串处理任务。
  11. 提问环节询问业务方向、工作时间、工作薪资等。
  12. 面试反馈

结语

面试结束后,仅 30 分钟就约了周三的 HR 面,整个过程非常高效。面试官全程未开摄像头,让我无法知晓对面的状态,但 Go 基础、Mysql 和微服务确实是提问的重点。希望这次面试经历能给大家带来启发和帮助,祝大家都能顺利拿下心仪的岗位!

欢迎关注 ❤

我们搞了一个**********,互通有无,一起刷题进步。

没准能让你能刷到自己意向公司的最新面试题呢。

感兴趣的朋友们可以加我微信:“ ***************** ”,备注:牛客。

#百度面经##面经##Go语言##面试#
Go面试题汇总 文章被收录于专栏

汇总高频且经典的Go面试题,Go面试不用东奔西走,看这个面试题就Go了。

全部评论

相关推荐

2 16 评论
分享
牛客网
牛客企业服务