Go面经 成都Go面试这么卷?卷王介绍:游戏行业 3年经验 20k+_go语言卷不卷-程序员宅基地

技术标签: 程序员  面试  golang  游戏  

第二家

Golang后端,坐标成都,游戏行业,15~20k

先说感受,总体不是很难。下面听我慢慢聊:

A -> 面试官

B -> 我

A:自我介绍

B:巴拉巴拉

A:我看你简历上提到力扣做了挺多题的。

B:是的,但是已经有段时间没做了,做过的题我都有基本思路。

A:你能说说你知道哪些排序吗?

B:冒泡、选择、插入、快速、归并、堆、桶

A:快排你能说一下它的思路吗?

B:通过选择一个基准元素,将数组分割成左右两个子数组,再对子数组进行递归排序,直到整个数组有序。

A:稳定排序和不稳定排序的概念能换说一下吗?

B:假如排序前后两个元素的相对顺序在排序后仍然不变,那么这种算法就是稳定排序。不稳定排序反之。(这里答的其实不太好,可以结合前面提到的排序算法说一下,哪些具体的算法是稳定的)

A:你对二叉树了解吗?

B:了解的,树形结构,有根节点、父节点、子节点、叶子节点、度、高度、深度这些概念。

A:常见的二叉树有哪些?

B:平衡二叉树、二叉搜索树,巴拉巴拉。

A:能说一下前序遍历和后序遍历吗?

B:前序遍历,遍历顺序是根节点、左子树、右子树。后序遍历是左子树、右子树、根节点。

A:前序遍历和后续遍历能够构建一颗二叉树吗?

B:额,这个问题我不太理解。。。

A:没事,换一个问题。Go 语言中的 Map 是如何实现的,你能聊一聊吗?

B:Map 是使用哈希表、链表来实现的。然后我从散列函数、解决哈希冲突、动态扩容、并发安全性聊

A:Go 的并发模式你了解吗?

B:请问是指的扇入扇出模式、for select 循环模式这种吗?(后来回忆一下,面试官想让我聊的应该是CSP并发模型)

A:不是,你可以说一说你了解的 Go 的并发原语

B:好的,我从两个部分简单说一下,一个就是关键字,另一个是包。像关键字有 go,创建协程。channel,进行通信。select,处理 channel 的收发。mutex,锁。context,上下文。包的话 atomic。

A:你知道 csp 吗,能简单说一下嘛?

B:(我脑子里第一时间和 cap 搞混了,但还是拉回来了)csp 是一种通信协作模型。在 Go 里面有一句很经典的话,不要用共享内存来通信,要用通信来共享内存。

A:(露出了满意的笑容,扭头看向旁边的同事)我没什么问的了,你有什么问的吗?

B:你之前用过 mongodb,存储在 mongodb 中的索引你是怎么设计的?

A:不好意思,我之前没有关注过这个部分,因为之前的整体架构都是将需要落盘的数据放在内存,然后标记脏位,通过一些策略来异步落盘,而需要查询数据时,也是直接从内存查询,因为项目启动时,会把所有的玩家数据加载到内存中。

B:没事,那我们聊一下 redis 吧,你知道 redis 的落盘方案吗?

A:知道,AOF、RDB(然后开始介绍它们的特点)巴拉巴拉

B:你会如何评估 redis 的落盘方案?

A:我会从数据安全性、可恢复性、性能、硬盘空间成本、使用场景来评估。

B:硬盘空间成本?你能具体说说吗?

A:AOF占用空间大等…巴拉巴拉。

B:redis 的 Key 过长会影响性能吗?

A:额,我觉得应该会影响性能,因为你问了这个问题,但是这个我没太关注过,对于 Key 我更在意的是可读性。

最后聊了一些 Redis 的数据结构,又继续聊了一下一些特定二叉树的概念,还问了我对于矩阵、向量的理解,我就围绕以前做过的天赋系统聊了一下矩阵。

复盘!复盘!

为了对大家更有帮助,我把面试中回答的关键问题,做了复盘和调研,总结如下:

Actor模型

Actor模型是一种并发计算模型,用于描述并发系统中的实体和它们之间的通信。在Actor模型中,系统中的每个实体被称为一个Actor,每个Actor都有自己的状态和行为,并且可以通过消息传递与其他Actor进行通信。

在Actor模型中,每个Actor都是独立的,它们之间没有共享的内存。Actor之间通过异步消息传递进行通信,一个Actor可以向其他Actor发送消息,也可以接收其他Actor发送的消息。当一个Actor接收到消息时,它可以根据消息内容和自身的状态来决定如何处理消息,并可能改变自身的状态或向其他Actor发送消息。

Actor模型的特点包括:

1. 并发性: 每个Actor都可以独立地执行,不受其他Actor的影响,从而实现并发执行。

2. 无共享状态: 每个Actor都有自己的状态,不与其他Actor共享内存,避免了共享状态带来的并发问题。

3. 异步消息传递: Actor之间通过异步消息传递进行通信,消息的发送和接收是非阻塞的,提高了系统的响应性能。

4. 面向对象: 每个Actor都可以看作是一个对象,具有自己的状态和行为,可以封装数据和方法。

总结一下:通过使用Actor模型,可以简化并发系统的设计和实现,提高系统的可扩展性和可维护性。同时,Actor模型也能够有效地处理并发问题,避免了传统并发编程中常见的共享状态和锁竞争的问题。

对比Go的GMP模型和Actor模型

Go的GMP(Goroutine, M, P)模型和Actor模型都是用于并发编程的模型,但在一些方面有所不同。

Go的GMP模型是Go语言并发编程的基础,它通过goroutine(轻量级线程)和调度器(scheduler)来实现并发。GMP模型中的goroutine是Go语言中的并发执行单元,它可以独立地执行函数或方法。调度器负责将goroutine分配给线程(P),以便并行执行。线程(P)是操作系统线程的抽象,它负责执行goroutine。M(Machine)是Go语言运行时系统的一部分,它管理线程的创建和销毁,并提供与操作系统的交互。GMP模型的优点是轻量级的goroutine和高效的调度器,使得并发编程变得简单且高效。

Actor模型是一种并发编程模型,它通过将并发执行的单元(称为actor)之间的通信和状态封装在一起来实现并发。在Actor模型中,每个actor都是独立的实体,它们通过消息传递进行通信。每个actor都有自己的状态和行为,并且只能通过接收和发送消息来与其他actor进行通信。Actor模型的优点是提供了一种结构化的方式来处理并发,避免了共享状态和锁的问题。

虽然GMP模型和Actor模型都是用于并发编程,但它们在实现方式和语义上有所不同。GMP模型更加底层,直接操作线程和goroutine,适用于需要更细粒度控制的场景。而Actor模型更加高级,通过消息传递来实现并发,适用于需要更结构化和可扩展的场景。

总结起来,GMP模型适用于Go语言中的并发编程,提供了轻量级的goroutine和高效的调度器;而Actor模型适用于一般的并发编程,通过消息传递来实现并发。

epoll模型

epoll是一种在Linux系统中用于高效处理大量并发连接的I/O事件通知机制。它具有以下特点:

  1. 支持高并发:epoll使用事件驱动的方式,能够同时处理大量的并发连接,适用于高并发的网络应用场景。
  2. 高效的事件通知机制:epoll采用了基于事件驱动的方式,当有事件发生时,内核会将事件通知给应用程序,而不需要应用程序轮询检查事件是否发生,从而减少了系统资源的消耗。
  3. 支持边缘触发和水平触发:epoll提供了两种工作模式,边缘触发(EPOLLET)和水平触发(EPOLLIN/EPOLLOUT)。边缘触发模式只在状态发生变化时通知应用程序,而水平触发模式则在状态可读或可写时都会通知应用程序。
  4. 支持多种I/O事件类型:epoll可以同时监控多种I/O事件类型,包括读事件、写事件、错误事件等。
  5. 高效的内核数据结构:epoll使用红黑树和双向链表等高效的数据结构来管理大量的文件描述符,提高了事件的处理效率。

总之,epoll模型具有高并发、高效的事件通知机制和多种I/O事件类型的支持,适用于处理大量并发连接的网络应用场景。

etcd保证数据一致性

etcd通过使用Raft一致性算法来保证数据的一致性。 Raft是一种分布式一致性算法,它将集群中的节点分为Leader、Follower和Candidate三种角色,通过选举机制选出Leader节点来处理客户端的请求。

当客户端向etcd发送写请求时,Leader节点会将该请求复制到其他节点的日志中,并等待大多数节点确认接收到该日志条目。一旦大多数节点确认接收到该日志条目,Leader节点会将该请求应用到自己的状态机中,并将结果返回给客户端。同时,Leader节点会通知其他节点将该请求应用到自己的状态机中。

如果Leader节点失去连接或崩溃,剩余的节点会通过选举机制选出新的Leader节点。新的Leader节点会根据自己的日志和其他节点的日志进行比较,保证自己的日志是最新的,并将缺失的日志条目复制给其他节点,以保持数据的一致性。

通过Raft算法,etcd能够保证数据在集群中的一致性,并且在Leader节点失效时能够快速选举出新的Leader节点,保证系统的可用性和数据的一致性。

redis的落盘方案

Redis的落盘方案主要有两种:RDB(Redis Database)和AOF(Append Only File)。

  1. RDB(Redis Database):RDB是Redis默认的持久化方式。它通过将Redis的内存数据快照保存到磁盘上的二进制文件中来实现持久化。RDB的优点是快速和紧凑,适合用于备份和恢复数据。RDB的缺点是在发生故障时可能会丢失一部分数据,因为RDB是定期进行持久化的,而不是实时的。
  2. AOF(Append Only File):AOF是另一种持久化方式,它通过将Redis的写操作追加到文件末尾来记录数据的变化。AOF的优点是可以提供更好的数据安全性,因为它记录了每个写操作,可以在发生故障时进行恢复。AOF的缺点是相对于RDB来说,文件体积较大,恢复数据的速度较慢。

在实际应用中,可以根据需求选择适合的落盘方案。如果对数据的安全性要求较高,可以选择AOF方式;如果对数据的实时性要求较高,可以选择RDB方式。另外,也可以同时使用RDB和AOF两种方式,以提供更好的数据保护和恢复能力。

更多面经

下面的面经同样精彩,希望对大家找工作有帮助:

一天约了4个面试,复盘一下面试经历和薪资范围

一起学习

欢迎添加我的微信,一起学习进步:wangzhongyang1993

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Go语言工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Go语言全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Golang知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-capNLJq2-1712970138107)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2401_84252820/article/details/137705711

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签