go语言面试真题及答案 go语言面试真题及答案大全
go面试题整理(附带部分自己的解答)
原文:【 】
目前成都创新互联公司已为近1000家的企业提供了网站建设、域名、虚拟主机、网站托管、企业网站设计、民勤网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
如果有解答的不对的,麻烦各位在评论写出来~
go的调度原理是基于GMP模型,G代表一个goroutine,不限制数量;M=machine,代表一个线程,最大1万,所有G任务还是在M上执行;P=processor代表一个处理器,每一个允许的M都会绑定一个G,默认与逻辑CPU数量相等(通过runtime.GOMAXPROCS(runtime.NumCPU())设置)。
go调用过程:
可以能,也可以不能。
因为go存在不能使用==判断类型:map、slice,如果struct包含这些类型的字段,则不能比较。
这两种类型也不能作为map的key。
类似栈操作,后进先出。
因为go的return是一个非原子性操作,比如语句 return i ,实际上分两步进行,即将i值存入栈中作为返回值,然后执行跳转,而defer的执行时机正是跳转前,所以说defer执行时还是有机会操作返回值的。
select的case的表达式必须是一个channel类型,所有case都会被求值,求值顺序自上而下,从左至右。如果多个case可以完成,则会随机执行一个case,如果有default分支,则执行default分支语句。如果连default都没有,则select语句会一直阻塞,直到至少有一个IO操作可以进行。
break关键字可跳出select的执行。
goroutine管理、信息传递。context的意思是上下文,在线程、协程中都有这个概念,它指的是程序单元的一个运行状态、现场、快照,包含。context在多个goroutine中是并发安全的。
应用场景:
例子参考:
waitgroup
channel
len:切片的长度,访问时间复杂度为O(1),go的slice底层是对数组的引用。
cap:切片的容量,扩容是以这个值为标准。默认扩容是2倍,当达到1024的长度后,按1.25倍。
扩容:每次扩容slice底层都将先分配新的容量的内存空间,再将老的数组拷贝到新的内存空间,因为这个操作不是并发安全的。所以并发进行append操作,读到内存中的老数组可能为同一个,最终导致append的数据丢失。
共享:slice的底层是对数组的引用,因此如果两个切片引用了同一个数组片段,就会形成共享底层数组。当sliec发生内存的重新分配(如扩容)时,会对共享进行隔断。详细见下面例子:
make([]Type,len,cap)
map的底层是hash table(hmap类型),对key值进行了hash,并将结果的低八位用于确定key/value存在于哪个bucket(bmap类型)。再将高八位与bucket的tophash进行依次比较,确定是否存在。出现hash冲撞时,会通过bucket的overflow指向另一个bucket,形成一个单向链表。每个bucket存储8个键值对。
如果要实现map的顺序读取,需要使用一个slice来存储map的key并按照顺序进行排序。
利用map,如果要求并发安全,就用sync.map
要注意下set中的delete函数需要使用 delete(map) 来实现,但是这个并不会释放内存,除非value也是一个子map。当进行多次delete后,可以使用make来重建map。
使用sync.Map来管理topic,用channel来做队列。
参考:
多路归并法:
pre class="vditor-reset" placeholder="" contenteditable="true" spellcheck="false"p data-block="0"(1)假设有K路a href=""数据流/a,流内部是有序的,且流间同为升序或降序;
/pp data-block="0"(2)首先读取每个流的第一个数,如果已经EOF,pass;
/pp data-block="0"(3)将有效的k(k可能小于K)个数比较,选出最小的那路mink,输出,读取mink的下一个;
/pp data-block="0"(4)直到所有K路都EOF。
/p/pre
假设文件又1个G,内存只有256M,无法将1个G的文件全部读到内存进行排序。
第一步:
可以分为10段读取,每段读取100M的数据并排序好写入硬盘。
假设写入后的文件为A,B,C...10
第二步:
将A,B,C...10的第一个字符拿出来,对这10个字符进行排序,并将结果写入硬盘,同时记录被写入的字符的文件指针P。
第三步:
将刚刚排序好的9个字符再加上从指针P读取到的P+1位数据进行排序,并写入硬盘。
重复二、三步骤。
go文件读写参考:
保证排序前两个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同的排序叫稳定排序。
快速排序、希尔排序、堆排序、直接选择排序不是稳定的排序算法。
基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。
参考:
head只请求页面的首部。多用来判断网页是否被修改和超链接的有效性。
get请求页面信息,并返回实例的主体。
参考:
401:未授权的访问。
403: 拒绝访问。
普通的http连接是客户端连接上服务端,然后结束请求后,由客户端或者服务端进行http连接的关闭。下次再发送请求的时候,客户端再发起一个连接,传送数据,关闭连接。这么个流程反复。但是一旦客户端发送connection:keep-alive头给服务端,且服务端也接受这个keep-alive的话,两边对上暗号,这个连接就可以复用了,一个http处理完之后,另外一个http数据直接从这个连接走了。减少新建和断开TCP连接的消耗。这个可以在Nginx设置,
这个keepalive_timout时间值意味着:一个http产生的tcp连接在传送完最后一个响应后,还需要hold住keepalive_timeout秒后,才开始关闭这个连接。
特别注意TCP层的keep alive和http不是一个意思。TCP的是指:tcp连接建立后,如果客户端很长一段时间不发送消息,当连接很久没有收到报文,tcp会主动发送一个为空的报文(侦测包)给对方,如果对方收到了并且回复了,证明对方还在。如果对方没有报文返回,重试多次之后则确认连接丢失,断开连接。
tcp的keep alive可通过
net.ipv4.tcp_keepalive_intvl = 75 // 当探测没有确认时,重新发送探测的频度。缺省是75秒。
net.ipv4.tcp_keepalive_probes = 9 //在认定连接失效之前,发送多少个TCP的keepalive探测包。缺省值是9。这个值乘以tcp_keepalive_intvl之后决定了,一个连接发送了keepalive之后可以有多少时间没有回应
net.ipv4.tcp_keepalive_time = 7200 //当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时。一般设置为30分钟1800
修改:
可以
tcp是面向连接的,upd是无连接状态的。
udp相比tcp没有建立连接的过程,所以更快,同时也更安全,不容易被攻击。upd没有阻塞控制,因此出现网络阻塞不会使源主机的发送效率降低。upd支持一对多,多对多等,tcp是点对点传输。tcp首部开销20字节,udp8字节。
udp使用场景:视频通话、im聊天等。
time-wait表示客户端等待服务端返回关闭信息的状态,closed_wait表示服务端得知客户端想要关闭连接,进入半关闭状态并返回一段TCP报文。
time-wait作用:
解决办法:
close_wait:
被动关闭,通常是由于客户端忘记关闭tcp连接导致。
根据业务来啊~
重要指标是cardinality(不重复数量),这个数量/总行数如果过小(趋近于0)代表索引基本没意义,比如sex性别这种。
另外查询不要使用select *,根据select的条件+where条件做组合索引,尽量实现覆盖索引,避免回表。
僵尸进程:
即子进程先于父进程退出后,子进程的PCB需要其父进程释放,但是父进程并没有释放子进程的PCB,这样的子进程就称为僵尸进程,僵尸进程实际上是一个已经死掉的进程。
孤儿进程:
一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
子进程死亡需要父进程来处理,那么意味着正常的进程应该是子进程先于父进程死亡。当父进程先于子进程死亡时,子进程死亡时没父进程处理,这个死亡的子进程就是孤儿进程。
但孤儿进程与僵尸进程不同的是,由于父进程已经死亡,系统会帮助父进程回收处理孤儿进程。所以孤儿进程实际上是不占用资源的,因为它终究是被系统回收了。不会像僵尸进程那样占用ID,损害运行系统。
原文链接:
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
避免方法:
端口占用:lsof -i:端口号 或者 nestat
cpu、内存占用:top
发送信号:kill -l 列出所有信号,然后用 kill [信号变化] [进程号]来执行。如kill -9 453。强制杀死453进程
git log:查看提交记录
git diff :查看变更记录
git merge:目标分支改变,而源分支保持原样。优点:保留提交历史,保留分支结构。但会有大量的merge记录
git rebase:将修改拼接到最新,复杂的记录变得优雅,单个操作变得(revert)很简单;缺点:
git revert:反做指定版本,会新生成一个版本
git reset:重置到某个版本,中间版本全部丢失
etcd、Consul
pprof
节省空间(非叶子节点不存储数据,相对b tree的优势),减少I/O次数(节省的空间全部存指针地址,让树变的矮胖),范围查找方便(相对hash的优势)。
explain
其他的见:
runtime2.go 中关于 p 的定义: 其中 runnext 指针决定了下一个要运行的 g,根据英文的注释大致意思是说:
所以当设置 runtime.GOMAXPROCS(1) 时,此时只有一个 P,创建的 g 依次加入 P, 当最后一个即 i==9 时,加入的最后 一个 g 将会继承当前主 goroutinue 的剩余时间片继续执行,所以会先输出 9, 之后再依次执行 P 队列中其它的 g。
方法一:
方法二:
[图片上传失败...(image-4ef445-1594976286098)]
方法1:to_days,返回给的日期从0开始算的天数。
方法2:data_add。向日期添加指定时间间隔
[图片上传失败...(image-b67b10-1594976286098)]
golang面试题2之判断字符串中字符是否全都不同
请实现 个算法,确定 个字符串的所有字符【是否全都不同】。这 我们要求【不允
许使 额外的存储结构】。 给定 个string,请返回 个bool值,true代表所有字符全都
不同,false代表存在相同的字符。 保证字符串中的字符为【ASCII字符】。字符串的
度 于等于【3000】。
这 有 个重点,第 个是 ASCII字符 , ASCII字符 字符 共有256个,其中128个是常
字符,可以在键盘上输 。128之后的是键盘上 法找到的。
然后是全部不同,也就是字符串中的字符没有重复的,再次,不准使 额外的储存结
构,且字符串 于等于3000。
如果允许其他额外储存结构,这个题 很好做。如果不允许的话,可以使 golang内置
的 式实现。
通过 strings.Count 函数判断:
使 的是golang内置 法 strings.Count ,可以 来判断在 个字符串中包含
的另外 个字符串的数量
还有不同的方法同样可以实现,你了解吗?
推荐go相关技术 专栏
gRPC-go源码剖析与实战_带你走进gRPC-go的源码世界-CSDN博客
这些烧脑的牛津大学面试题,你能答出几道?
今天,带大家一起见识一下牛津大学本科面试题,涨涨知识,看看别人的大学都考些什么。顺便给小伙伴们一些思路,万一有一天考去呢。
今天,带大家一起见识一下牛津大学本科面试题,涨涨知识,看看别人的大学都考些什么。
顺便给小伙伴们一些思路,万一有一天考去呢……
这些烧脑的牛津大学面试题,你能答出几道?
生物科学
瓢虫是红的,草莓也是,为什么?
这些烧脑的牛津大学面试题,你能答出几道?
解答提示:常见的动植物是非常普遍的考点,这道题主要考察你的思辨能力。
红色既可以向取食者发送“别吃我”的信号,又可以发送“吃我”的信号。这道题考查考生如何解决这个明显的悖论。
计算机科学
海盗如何分财宝?
7个海盗共有100枚金币,他们必须自行决定如何分财宝,分财宝必须按照如下规则:
最年长的海盗提出一个分赃方案。
所有海盗(包括最年长者)进行投票,如果一半或以上的海盗赞同,那结果成立。如果少于一半,他们将最年长者投入大海并重新来过。
海盗逻辑性强,而且非常无情(只关注个人所得最大化)。
所以,最年长的海盗应如何建议把金币分给其他6个海盗?
✩ 解答提示:这是道标准的逻辑考题,同时教授们还将注重你解决问题和沟通能力。
这道题关注学生如何跟着引导走,是否能将大问题切分成小问题,用算法方式化解复杂的概念。如有问题,学生应该立即提出,而非闷声冥思苦想。
经济管理
银行家们的所得与付出是否成正比?政府是否应限制其所得?
✩ 解答提示:这道题反映了一个非常现实的金融问题,解题关键是从经济学角度解读收入,而非考虑公平性问题。
简单的答案:一般来讲银行是私人公司,员工能较为自由地自主选择工作地方,因此他们的个人所得是竞争激烈的劳动市场的结果。
英国文学
J.K. 罗琳在《哈利·波特》系列大获成功之后又推出了一本面向成人读者的书籍。你认为为孩子们写书和为成人写书有何区别?
解答提示:没读过这本书也不用慌,考官是想了解你是否是一个爱思考的读书人。
我想了解的是,不论考生们读过什么,他们都应该边读边思考,做个有心人,能够像一个文学批评家一样读书。我尽量通过他们知道的事情来评判他们,而非他们不知道的。
地理
如果我到你的家乡,我会对什么感兴趣?
✩ 解答提示:这道题考查的是你的“地理思维”以及对世界的好奇心。
这道题主要考查考生是否能将“地理思维”应用到他们周边的事物。这揭示了他们是否对周围的世界抱有好奇心。
历史
暴力中都含有政治因素吗?在不同的语境下,“政治”是否具有不同内涵?
✩ 解答提示:此题并非考查问题的解决,而是发现考生对已知领域的兴趣。
一个优秀的考生将能够在帮助下,将暴力含有政治因素多少的情况进行分类。而出类拔萃的考生将能够在帮助下建立起对于“政治”的有用定义,但这非常具有挑战性。
法律
如果停车停在双黄线上将判处死刑,那么没人会这么做。这是一条公正且行之有效的法律吗?
解答提示:结果不重要,对结果引发问题的思考才是考官们最看重的。
这道题不是要考生给出正确或错误的答案,但他们需要认识到结果将引发的系列问题。能够区分“公正”和“有效”的考生才是最优秀的。如果做出区分,则两者差别显而易见,公正的法律未必有效,反之亦然。
材料科学
如果我想用热气球吊起一头大象,里面的空气得多热?
解答提示:教授们设置这道题,肯定不是为了在很短时间内让你给出一个确切的答案。
我们看中的是:他们怎样快速地考虑到问题的核心;对于我们给出的暗示和建议他们如何应对;预估(典型热气球的大小,大象的重量)及归纳出最重要的是什么……
现代语言学
诗歌应不应该难以理解?
解答提示:当你谈到自己曾读过的一些文学作品时,教授们可能会问你这个问题。但它并没有固定答案,主要想探探你对文学的兴趣。
我们不期待你对于此类问题给出一个正确答案,这是为新的探讨方向开了个头:我们脑海中有哪种“困难”?这些仅针对诗歌还是同样适用于其他写作类型?
我们想知道的不是他们读过多少书,从而证明他们的兴趣所在,而是想确定他们对研究文本感兴趣。
既然英语是全球性语言,为什么要学法语?
解答提示:这个问题看似简单,实际大有深意,你的回答,会影响老师们接下来的问题。
考虑到现代语言学课程的属性,我会对法语是通向法国文化、文学、历史的“窗口”等这样的回答感兴趣;不过,如果有考生能探究该问题背后的假设:为什么英语是全球语言?那汉语和西班牙语呢?我也会很开心。
经济学
为什么美国人均收入是布隆迪、马拉维这样国家的50到100倍?
✩ 解答提示:回答这个问题时,不能停留在问题表面,而要学会透过现象看本质。
这个问题关注的可能是最重要的经济学问题:为什么有些国家富有而有些国家贫穷?考生要考虑到存在这样的收入差距的所有潜在原因。
哲学
讨论责备他人时,我们讨论的什么?
✩ 解答提示:这是一道考查点很全面的问题。
这样的问题可以测出考生的各方面能力,比如:对于熟悉概念进行细致精确思考,评估提案,给出反例,解决各种考量,给出有创意的不同方法。
心理学
一项大规模研究证明,年长的哥哥姐姐智力测试得分一直比他们的弟弟妹妹高,这是为什么呢?
解答提示:这个问题也需要综合考虑很多因素,比如:出生顺序、母亲的生育年龄、父母是否专注陪伴等。
这个问题真的需要学生去考虑心理学的各个方面,在讨论过程中我们会引导学生去思考两个方面:科学因素,如母亲年龄,和观测分析,比如出生顺序可能会影响行为,进而影响智力测试中的表现。
实验显示,说威尔士语的人记电话号码不如说英语的人记得清楚,为什么呢?
✩ 解答提示:这个问题非常有趣,其实是对威尔士语和英语的讨论。
这题的关键是,跟英语相比,威尔士语中,数字的拼写更难也更长,而记忆(和算术)跟拼写的难易程度有关。
这个基本问题可以引发一些关于语言在记忆力、数学能力等认知能力方面发挥作用的有趣讨论。
我希望它可以让学生体会到,威尔士人并不比英格兰人笨!
为什么人类有两只眼睛?
✩ 解答提示:这个问题看似无从下手,但其实有很多回答方向。
这个问题可以向很多方面延伸,部分取决于面试者的知识和专业能力。比如,对于3D视角来说,两只眼睛很重要。
神学和宗教
那些冒着自己或他人生命危险进行极限运动或耐力活动的人是英雄还是傻子?
解答提示:如何把具体的问题和一个相对广泛的概念联系在一起,如何探索出更多值得谈论的问题是老师们想要看到的闪光点。
这个问题可以从很多角度入手,可以发掘更多话题——这种冲动自私吗?它是否对全人类的成就有贡献?英雄是什么,是与愚蠢相对的分类吗?
名校面试常见问题
除了这些专业性的问题,名校面试也包括一些常规问题。我也帮大家总结好了,来看看这些问题应该如何回答吧。
首先,你需要知道,面试官问这些问题要考察的是:
➤whether you have the maturity to speak clearly
你是否能够清楚地表达自己
➤whether you can be comfortable even in a nerve-wracking situation
你是否能够在非常紧张的情况下保持轻松
➤whether you can look them in the eye, smile, chat, have a solid “adult” conversation on an adult level
你是否能够看着对方的眼睛,微笑着和对方在成年人的层面展开一场“成人”之间的对话
➤whether you are clear in terms of who you are at this point in your life and where you want to go
你是否能够清楚地知道自己是谁,在当下人生中的定位,以及未来的方向
这些烧脑的牛津大学面试题,你能答出几道?
好了,接下来,面试通常会问这几个问题。
1What are you interested in studying in college?
你对大学学习的哪方面感兴趣?
问什么
这个问题问的是你的学术计划,以及未来的职业方向和兴趣,包括你的背景和个性等。
如何作答
选择一门学科,并说出为什么。要有明确的目标和方向,不要含糊不清。
2What high school accomplishment are you most proud of?
你高中期间最自豪的成就是什么?
问什么
这个问题除了能展现你的强项以外,还能透露出你的人生追求,让面试官更加全面地了解你。
如何作答
讲述自己的成就时要表现出热情和积极的一面,让面试官知道你是一个有激情的年轻人,这一点很重要。
3Tell me about your family background? Where did you grow up?
说说你的家庭背景,你在哪儿长大的?
问什么
通过这个问题,面试官想了解的是,你是在怎样的环境中成长起来的,在社会上属于怎样一类人,更重要的是了解你对自己的成长背景的感受和看法。
如何作答
如实作答,多谈谈你自己,千万别只答一句话。
4What is an example of something difficult you've had to go through, or an important event perhaps that took place in your life in the last few years?
过去几年你是否经历过艰难或重要的时刻?
问什么
这个问题问的是你是谁、你有怎样的价值观,对你来说最重要的是什么。面试官想了解你是怎样一个人,你和他人的关系等。
如何作答
回答这一题时,要自信地说出你的故事。同时也要展示出一种自省的态度,要反映出你在思考这些经历。不要回答得太简短。
5Why Harvard or Why Princeton? or Why Columbia? …
为什么选择哈佛/普林斯顿/哥伦比亚……?
问什么
这一题问的是你对学校的了解。
如何作答
回答这一题前要做好功课,查查各学校的特色。作答时应主要谈该校在学术方面对你特别有吸引力的项目、课程、老师等等,但也不要局限于学业方面,也可以谈谈学校的氛围、课外活动等等,展示你是一个爱好广泛积极热情的人。
看了这么多名校面试题,你对自己有信心吗?
面试问题总结(一)Golang
使用go语言的好处: go语言的设计是务实的, go在针对并发上进行了优化, 并且支持大规模高并发, 又由于单一的码格式, 相比于其他语言更具有可读性, 在垃圾回收上比java和Python更有效, 因为他是和程序同时执行的.
1. 进程, 线程, 协程的区别, 协程的优势
2. 讲一下GMP模型(重点)
3. Go的GC, 混合写屏障(重点)
4. go的Slice和数组的区别, slice的扩容原理(重点)
5. 讲一下channel,实现原理(重点)
6. 讲一下Go的Map的实现原理, 是否线程安全, 如何实现安全(重点)
7. new 和 make 的区别
8. 说一下内存逃逸
9. 函数传指针和传值有什么区别
10. goroutine之间的通信方式
11. 测试是怎么做的(单元测试, 压力测试)
12. 堆和栈的区别
当前题目:go语言面试真题及答案 go语言面试真题及答案大全
地址分享:http://scyanting.com/article/ddjcphp.html