go语言面试100道 go语言笔试题
面试问题总结(一)Golang
使用go语言的好处: go语言的设计是务实的, go在针对并发上进行了优化, 并且支持大规模高并发, 又由于单一的码格式, 相比于其他语言更具有可读性, 在垃圾回收上比java和Python更有效, 因为他是和程序同时执行的.
发展壮大离不开广大客户长期以来的信赖与支持,我们将始终秉承“诚信为本、服务至上”的服务理念,坚持“二合一”的优良服务模式,真诚服务每家企业,认真做好每个细节,不断完善自我,成就企业,实现共赢。行业涉及成都阳台护栏等,在重庆网站建设公司、营销型网站建设、WAP手机网站、VI设计、软件开发等项目上具有丰富的设计经验。
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的调度原理是基于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博客
彻底理解Golang Map
本文目录如下,阅读本文后,将一网打尽下面Golang Map相关面试题
Go中的map是一个指针,占用8个字节,指向hmap结构体; 源码 src/runtime/map.go 中可以看到map的底层结构
每个map的底层结构是hmap,hmap包含若干个结构为bmap的bucket数组。每个bucket底层都采用链表结构。接下来,我们来详细看下map的结构
bmap 就是我们常说的“桶”,一个桶里面会最多装 8 个 key,这些 key 之所以会落入同一个桶,是因为它们经过哈希计算后,哈希结果是“一类”的,关于key的定位我们在map的查询和插入中详细说明。在桶内,又会根据 key 计算出来的 hash 值的高 8 位来决定 key 到底落入桶内的哪个位置(一个桶内最多有8个位置)。
bucket内存数据结构可视化如下:
注意到 key 和 value 是各自放在一起的,并不是 key/value/key/value/... 这样的形式。源码里说明这样的好处是在某些情况下可以省略掉 padding字段,节省内存空间。
当 map 的 key 和 value 都不是指针,并且 size 都小于 128 字节的情况下,会把 bmap 标记为不含指针,这样可以避免 gc 时扫描整个 hmap。但是,我们看 bmap 其实有一个 overflow 的字段,是指针类型的,破坏了 bmap 不含指针的设想,这时会把 overflow 移动到 extra 字段来。
map是个指针,底层指向hmap,所以是个引用类型
golang 有三个常用的高级类型 slice 、map、channel, 它们都是 引用类型 ,当引用类型作为函数参数时,可能会修改原内容数据。
golang 中没有引用传递,只有值和指针传递。所以 map 作为函数实参传递时本质上也是值传递,只不过因为 map 底层数据结构是通过指针指向实际的元素存储空间,在被调函数中修改 map,对调用者同样可见,所以 map 作为函数实参传递时表现出了引用传递的效果。
因此,传递 map 时,如果想修改map的内容而不是map本身,函数形参无需使用指针
map 底层数据结构是通过指针指向实际的元素 存储空间 ,这种情况下,对其中一个map的更改,会影响到其他map
map 在没有被修改的情况下,使用 range 多次遍历 map 时输出的 key 和 value 的顺序可能不同。这是 Go 语言的设计者们有意为之,在每次 range 时的顺序被随机化,旨在提示开发者们,Go 底层实现并不保证 map 遍历顺序稳定,请大家不要依赖 range 遍历结果顺序。
map 本身是无序的,且遍历时顺序还会被随机化,如果想顺序遍历 map,需要对 map key 先排序,再按照 key 的顺序遍历 map。
map默认是并发不安全的,原因如下:
Go 官方在经过了长时间的讨论后,认为 Go map 更应适配典型使用场景(不需要从多个 goroutine 中进行安全访问),而不是为了小部分情况(并发访问),导致大部分程序付出加锁代价(性能),决定了不支持。
场景: 2个协程同时读和写,以下程序会出现致命错误:fatal error: concurrent map writes
如果想实现map线程安全,有两种方式:
方式一:使用读写锁 map + sync.RWMutex
方式二:使用golang提供的 sync.Map
sync.map是用读写分离实现的,其思想是空间换时间。和map+RWLock的实现方式相比,它做了一些优化:可以无锁访问read map,而且会优先操作read map,倘若只操作read map就可以满足要求(增删改查遍历),那就不用去操作write map(它的读写都要加锁),所以在某些特定场景中它发生锁竞争的频率会远远小于map+RWLock的实现方式。
golang中map是一个kv对集合。底层使用hash table,用链表来解决冲突 ,出现冲突时,不是每一个key都申请一个结构通过链表串起来,而是以bmap为最小粒度挂载,一个bmap可以放8个kv。在哈希函数的选择上,会在程序启动时,检测 cpu 是否支持 aes,如果支持,则使用 aes hash,否则使用 memhash。
map有3钟初始化方式,一般通过make方式创建
map的创建通过生成汇编码可以知道,make创建map时调用的底层函数是 runtime.makemap 。如果你的map初始容量小于等于8会发现走的是 runtime.fastrand 是因为容量小于8时不需要生成多个桶,一个桶的容量就可以满足
makemap函数会通过 fastrand 创建一个随机的哈希种子,然后根据传入的 hint 计算出需要的最小需要的桶的数量,最后再使用 makeBucketArray 创建用于保存桶的数组,这个方法其实就是根据传入的 B 计算出的需要创建的桶数量在内存中分配一片连续的空间用于存储数据,在创建桶的过程中还会额外创建一些用于保存溢出数据的桶,数量是 2^(B-4) 个。初始化完成返回hmap指针。
找到一个 B,使得 map 的装载因子在正常范围内
Go 语言中读取 map 有两种语法:带 comma 和 不带 comma。当要查询的 key 不在 map 里,带 comma 的用法会返回一个 bool 型变量提示 key 是否在 map 中;而不带 comma 的语句则会返回一个 value 类型的零值。如果 value 是 int 型就会返回 0,如果 value 是 string 类型,就会返回空字符串。
map的查找通过生成汇编码可以知道,根据 key 的不同类型,编译器会将查找函数用更具体的函数替换,以优化效率:
函数首先会检查 map 的标志位 flags。如果 flags 的写标志位此时被置 1 了,说明有其他协程在执行“写”操作,进而导致程序 panic。这也说明了 map 对协程是不安全的。
key经过哈希函数计算后,得到的哈希值如下(主流64位机下共 64 个 bit 位):
m: 桶的个数
从buckets 通过 hash m 得到对应的bucket,如果bucket正在扩容,并且没有扩容完成,则从oldbuckets得到对应的bucket
计算hash所在桶编号:
用上一步哈希值最后的 5 个 bit 位,也就是 01010 ,值为 10,也就是 10 号桶(范围是0~31号桶)
计算hash所在的槽位:
用上一步哈希值哈希值的高8个bit 位,也就是 10010111 ,转化为十进制,也就是151,在 10 号 bucket 中寻找** tophash 值(HOB hash)为 151* 的 槽位**,即为key所在位置,找到了 2 号槽位,这样整个查找过程就结束了。
如果在 bucket 中没找到,并且 overflow 不为空,还要继续去 overflow bucket 中寻找,直到找到或是所有的 key 槽位都找遍了,包括所有的 overflow bucket。
通过上面找到了对应的槽位,这里我们再详细分析下key/value值是如何获取的:
bucket 里 key 的起始地址就是 unsafe.Pointer(b)+dataOffset。第 i 个 key 的地址就要在此基础上跨过 i 个 key 的大小;而我们又知道,value 的地址是在所有 key 之后,因此第 i 个 value 的地址还需要加上所有 key 的偏移。
通过汇编语言可以看到,向 map 中插入或者修改 key,最终调用的是 mapassign 函数。
实际上插入或修改 key 的语法是一样的,只不过前者操作的 key 在 map 中不存在,而后者操作的 key 存在 map 中。
mapassign 有一个系列的函数,根据 key 类型的不同,编译器会将其优化为相应的“快速函数”。
我们只用研究最一般的赋值函数 mapassign 。
map的赋值会附带着map的扩容和迁移,map的扩容只是将底层数组扩大了一倍,并没有进行数据的转移,数据的转移是在扩容后逐步进行的,在迁移的过程中每进行一次赋值(access或者delete)会至少做一次迁移工作。
1.判断map是否为nil
每一次进行赋值/删除操作时,只要oldbuckets != nil 则认为正在扩容,会做一次迁移工作,下面会详细说下迁移过程
根据上面查找过程,查找key所在位置,如果找到则更新,没找到则找空位插入即可
经过前面迭代寻找动作,若没有找到可插入的位置,意味着需要扩容进行插入,下面会详细说下扩容过程
通过汇编语言可以看到,向 map 中删除 key,最终调用的是 mapdelete 函数
删除的逻辑相对比较简单,大多函数在赋值操作中已经用到过,核心还是找到 key 的具体位置。寻找过程都是类似的,在 bucket 中挨个 cell 寻找。找到对应位置后,对 key 或者 value 进行“清零”操作,将 count 值减 1,将对应位置的 tophash 值置成 Empty
再来说触发 map 扩容的时机:在向 map 插入新 key 的时候,会进行条件检测,符合下面这 2 个条件,就会触发扩容:
1、装载因子超过阈值
源码里定义的阈值是 6.5 (loadFactorNum/loadFactorDen),是经过测试后取出的一个比较合理的因子
我们知道,每个 bucket 有 8 个空位,在没有溢出,且所有的桶都装满了的情况下,装载因子算出来的结果是 8。因此当装载因子超过 6.5 时,表明很多 bucket 都快要装满了,查找效率和插入效率都变低了。在这个时候进行扩容是有必要的。
对于条件 1,元素太多,而 bucket 数量太少,很简单:将 B 加 1,bucket 最大数量( 2^B )直接变成原来 bucket 数量的 2 倍。于是,就有新老 bucket 了。注意,这时候元素都在老 bucket 里,还没迁移到新的 bucket 来。新 bucket 只是最大数量变为原来最大数量的 2 倍( 2^B * 2 ) 。
2、overflow 的 bucket 数量过多
在装载因子比较小的情况下,这时候 map 的查找和插入效率也很低,而第 1 点识别不出来这种情况。表面现象就是计算装载因子的分子比较小,即 map 里元素总数少,但是 bucket 数量多(真实分配的 bucket 数量多,包括大量的 overflow bucket)
不难想像造成这种情况的原因:不停地插入、删除元素。先插入很多元素,导致创建了很多 bucket,但是装载因子达不到第 1 点的临界值,未触发扩容来缓解这种情况。之后,删除元素降低元素总数量,再插入很多元素,导致创建很多的 overflow bucket,但就是不会触发第 1 点的规定,你能拿我怎么办?overflow bucket 数量太多,导致 key 会很分散,查找插入效率低得吓人,因此出台第 2 点规定。这就像是一座空城,房子很多,但是住户很少,都分散了,找起人来很困难
对于条件 2,其实元素没那么多,但是 overflow bucket 数特别多,说明很多 bucket 都没装满。解决办法就是开辟一个新 bucket 空间,将老 bucket 中的元素移动到新 bucket,使得同一个 bucket 中的 key 排列地更紧密。这样,原来,在 overflow bucket 中的 key 可以移动到 bucket 中来。结果是节省空间,提高 bucket 利用率,map 的查找和插入效率自然就会提升。
由于 map 扩容需要将原有的 key/value 重新搬迁到新的内存地址,如果有大量的 key/value 需要搬迁,会非常影响性能。因此 Go map 的扩容采取了一种称为“渐进式”的方式,原有的 key 并不会一次性搬迁完毕,每次最多只会搬迁 2 个 bucket。
上面说的 hashGrow() 函数实际上并没有真正地“搬迁”,它只是分配好了新的 buckets,并将老的 buckets 挂到了 oldbuckets 字段上。真正搬迁 buckets 的动作在 growWork() 函数中,而调用 growWork() 函数的动作是在 mapassign 和 mapdelete 函数中。也就是插入或修改、删除 key 的时候,都会尝试进行搬迁 buckets 的工作。先检查 oldbuckets 是否搬迁完毕,具体来说就是检查 oldbuckets 是否为 nil。
如果未迁移完毕,赋值/删除的时候,扩容完毕后(预分配内存),不会马上就进行迁移。而是采取 增量扩容 的方式,当有访问到具体 bukcet 时,才会逐渐的进行迁移(将 oldbucket 迁移到 bucket)
nevacuate 标识的是当前的进度,如果都搬迁完,应该和2^B的长度是一样的
在evacuate 方法实现是把这个位置对应的bucket,以及其冲突链上的数据都转移到新的buckets上。
转移的判断直接通过tophash 就可以,判断tophash中第一个hash值即可
遍历的过程,就是按顺序遍历 bucket,同时按顺序遍历 bucket 中的 key。
map遍历是无序的,如果想实现有序遍历,可以先对key进行排序
为什么遍历 map 是无序的?
如果发生过迁移,key 的位置发生了重大的变化,有些 key 飞上高枝,有些 key 则原地不动。这样,遍历 map 的结果就不可能按原来的顺序了。
如果就一个写死的 map,不会向 map 进行插入删除的操作,按理说每次遍历这样的 map 都会返回一个固定顺序的 key/value 序列吧。但是 Go 杜绝了这种做法,因为这样会给新手程序员带来误解,以为这是一定会发生的事情,在某些情况下,可能会酿成大错。
Go 做得更绝,当我们在遍历 map 时,并不是固定地从 0 号 bucket 开始遍历,每次都是从一个**随机值序号的 bucket 开始遍历,并且是从这个 bucket 的一个 随机序号的 cell **开始遍历。这样,即使你是一个写死的 map,仅仅只是遍历它,也不太可能会返回一个固定序列的 key/value 对了。
面试常见100道问题及回答(4)
四:能力表现
问题:假如你流落荒岛,可以拥有一本书,你会选择哪一本?为什么?
回答:我选择生活 百科 全书,因为此时人最基本的问题是解决生存问题。
点评:这是假设性问题,来测试应试者的 想象力 、解决问题的能力,目的看你有没有急才,思想有没有条理。
问题:你喜欢你们学校吗?你的老师怎么样?
回答:我很喜欢学校,那是我学习、生活了四年的地方,也是我成材、成熟的人生车站。四年中也碰到了许多好老师,对我思想上引导、学业上指导、能力上辅导,我从心里感谢他们。特别我们的英语老师,上课非常幽默,回想起来仍感到回味无穷。
点评:每个学生对这个问题一定要持积极肯定的态度。这是主考者考察应试者的个人品格的题目。作为一个具有高度思想觉悟和良好道德品质的现代大学生,尊师爱校是应有的品质。此外,人们普遍认为,一个不热爱母校、不尊敬老师的大学毕业生,也很难谈得上热爱就业单位,尊敬单位领导及老同志。因此,因充满激情地简单说明喜欢自己母校的原因,及老师对自己在学业和能力上的帮助和影响。
问题:谈一谈你在过去工作中生活中遇到的问题,以及如何解决。
回答:举一个你在过去的工作中或生活中遇到的问题,说明你是如何解决该问题的。
点评:判断你对问题的分析能力,看看你有没有团队精神和克服困难的信心。这也是给你一个表现自我的机会。
问题:你为什么想要换工作?
回答:“我想进一步发挥我的能力”,或“我目前单位的发展机会非常有限。”
点评:这个问题是判断你的动机,和你处理问题的能力。切记,不要抱怨你过去或目前的雇主。
问题:为什么要录用你?
回答:这是你要回答好的最重要的问题。根据公司目前的需要,强调你的背景优势,根据工作的需求叙述一下你的能力。如果你没有相关工作经验,强调你的其他工作经验和所受的教育,适合这个工作。
点评:确定你是不是最佳人选,看看你有没有自信心。
问题:你为什么这么长时间没有工作?
回答:我花了很长一段时间对自己的经历进行了反省和总结,并仔细研究了目前的就业市场,以确定自己的目标和方向,当然我也有过一些工作机会,但我的目的不仅仅是找一份工作,我追求的是有发展前途的未来。今天来应聘贵公司,我觉得贵公司适合我的发展。
点评:判断你对难题的应变能力,以及你对实际生活中问题的判断和处理能力。
问题:你今后打算是什么?
回答:“我希望我能够在这个公司里长久地工作。根据自己的能力和表现,不断地增加工作中所担负的责任。”
点评:看看你真正想要得到的是什么,以判定你是否会长期在公司工作。明确你的个人目标和公司是否一致。
问题:能否介绍一下你的社会活动能力
回答:
1.我的外交能力较强,在校学生会我担任外联部长。
2.我在校尽可能多地参加一些能发挥自己特长的活动,使社会活动能力得到了一定的提高。
3.我善于组织同学开展活动,如组织演讲赛, 辩论 赛,知识抢答赛等等,而且活动也较成功,从中可以证实我有一定的社会活动能力。
4.在校期间,我曾担任过班长职务。为了把班级基础文明建设搞好,组织全班同学进行校规校纪学习,集思广益,制定了“班规十条”,并要求全班同学严格遵守班级纪律。经过大家的努力,我班评为校先进班级,全班同学学习努力,团结友爱。
点评:
1.过于简单,草率,效果不好。
2.比较谦虚地说明自己有一定的能力,但言之无物,有些空洞。
3.如实的介绍自己曾组织过活动,但不具体。
4.通过例举事例,来说明自己的能力,有理有据,效果最佳,使主试者了解其素质和能力。
问题:你的外语水平如何?
回答:
如果你水平高的话,对方又是懂外语的面试官你可以直接用外语进行回答你外语所具备的能力,得到的证书或托福的考分,以表示你的能力。但表示还不够,还需努力继续学习。
若你的水平较低,就应如实回答 ,讲出低的原因,如笔头翻译不差,口语听力稍差,或专业词汇较熟悉,人文词汇掌握较少等。并表示你目前还在学习。
点评:遇到的问题属于自己的长处,也不要洋洋洒洒,滔滔不绝。对方问到自己的短处,不要避而不谈,或者转移话题,其实每一个人即使是非常优秀的人都会有自己的弱点,这种情况下应该正面回答对方的问题,同时如果自己认为这是一个欠缺而又是对方的招聘条件的话,应该积极表示自己现在的或者即将的行动用来克服这方面的缺点。
问题:你的计算机能力如何?
回答:
如果你这方面能力较差的话,你就应该告诉他们你的计算机能力较为欠缺,但是你目前还在继续学习计算机。
如果能力强的话,就可直接告诉他们你所得到的高级或中级编程员证书,及计算机的其他能力。
点评:遇到的问题属于自己的长处,也不要洋洋洒洒,滔滔不绝。对方问到自己的短处,不要避而不谈,或者转移话题,其实每一个人即使是非常优秀的人都会有自己的弱点,这种情况下应该正面回答对方的问题,同时如果自己认为这是一个欠缺而又是对方的招聘条件的话,应该积极表示自己现在的或者即将的行动用来克服这方面的缺点。
问题:你好象不适合到我们公司工作?
回答:可能在刚才的陈述中没把问题谈清楚,是我引起你的误解。其实我对贵公司非常尊重,对公司业务也有一些了解,我想在贵公司经过培训和工作后,是能够达到贵公司要求的,请务必再次考虑录用的问题。
点评:应答时,千万要注意不可反问对方提出的此问题的理由。此问有时也是主试者考验应试者到企业的决心,和应试者的自信心。
问题:你认为对员工的管理严厉的好,还是宽松的好?
回答:我想这要因时因人而定的,不能千篇一律。有些人对严厉的管理 方法 反应良好,有些人却需要鼓励才能做得更好。好的管理人员应该知道怎么使他的部属发挥更大的潜力。
点评:你不清楚企业需要的是什么样的管理作风,也是测试你能接受什么样的管理风格,如你确实不能接受他们的管理风格,那等到录取了再抉择。
问题:你对营销、管理工作如何看待?
回答:现在社会竞争非常激烈,营销、管理工作不是光凭热情能干好的,它需要经常做些调查研究,了解社会需求,提出目标、计划,同时,需要各方面的配合,才能把工作做的更好。
点评:应聘者对所应聘的岗位不能仅仅是有热情,同时还要冷静、理智地作出一些工作设想,这既说明了工作的积极主动性,也表明了应聘者是一个聪慧且思考成熟的人。
问题:如果公司与另外一家公司同时录用你,你将如何选择?
回答:
1.贵公司是我的第一选择。
2.我不敢奢望有两家公司同时看上我,即使有此情况,我还是首选贵公司。
点评:无论你到哪家公司应聘,都应这么回答,在未确定最后的归属前,回答这个问题不能有丝毫犹豫。
问题:假如我们聘用你,但有时需要做些倒茶端水的杂务,你会反对吗?
回答:“只要需要,我不会斤斤计较。”“如果有客人到我所在的那个部门,我会主动倒茶端水,这些杂务只是我的工作内容的一小部分而已。”
点评:这是一个试探性问题,目的是观察应聘者的反应,以判断你对工作的态度。因没有任何一家公司会聘用大学毕业生专门从事杂务工作。若明确拒绝接受这类杂务,则意味着拒绝接受职位,且在面试时与主试者争论差别毫无意义。
问题:你喜欢什么样的上司?
回答:
忌:“谁做我的上司都喜欢。”或“不知道”
应:“我本人比较喜欢有真才实学,公正严明的上司。”
点评:大多数应聘者对上司的背景毫不知情,因此,用一些普通适用的公认标准为好
问题:你对大学生就业市场的评价如何?
回答:这个问题很大,很难用三言两语概括清楚。在双向选择,自主择业的政策下,要就业,找市场已被学生接受,虽然就业市场形势严峻,但我们乐意在市场中参与竞争,选择合适自己的职业。
点评:主试人为测验应试者分析问题与 逻辑思维 能力,有意提一些很难回答的问题。回答此问题时应边说边想。若想好了再说,主试人会认为你反映迟钝。为了赢得思考的时间,开头可以先说一句开场白,后面边想边说,分条回答。想起一条答一条,在答第一条时就想第二条,依此类推。回答完了的时候,再从中找出一两个重点。这样就容易获得构思敏捷,思路清晰,善于抓住要害的好评。
问题:你喜欢和何种人共事?
回答:总的说来我是一个开朗的人,我喜欢和有相同个性的人打交道。
点评:此句意在了解求职者本身的个性特点,并借此来分析求职者一旦进入新的机构后与现职位的其他人员的相容程度,主考官据此判断此人是否能与其他人融洽相处。按照一句时髦的话来说,就是看看求职者是否具有团队精神。作为求职者,应当注意不要过分对此句话“躲躲闪闪”或是故意回避,回答这个问题时,要先大概介绍一下自己的个性特点,然后再说喜欢同什么样的人相处,总之要言之有理,顺理成章。
问题:小姐,假如在将来的工作中,你接待的客人要你陪跳舞,你不想跳,但不跳又不行,你会怎么办?
回答:
1.你们是什么样的鬼单位,在这里摆摊招舞女。”说完头也不回扬长而去。
2.若是工作需要,要陪客人跳舞,跳跳也无妨。若是客人另有意思,那可约男同事一起去娱乐。
点评:此是外贸进出口公司在人才会上招聘秘书,单位是很正派很有声望的企业,提出这一问题,考官只是想试试求职者的口头应变能力和处事能力。该小姐只要冷静下来,思考考官提出的问题,把自己的看法如实说出,作机敏的回答,就不至于失去一份很有前途的工作。
问题:你可以有三分钟的表现自己的机会,若表现得使我感兴趣,就留下来,否则另请高就。
回答:这三分钟的表现,可以成为你去留的依据,有的学生充分显示实力,把握了机会,有的学生则不会表现而被淘汰。有的学生为了显得谦虚,尽量少讲自己的优点,少表现自己,结果也失去了这个机会。
点评:此类面试问题一般是企业总经理面试时提的,他们的话简单明了:“你连自己都推销不掉,你帮我推什么?要帮我推销商品,推销企业形象,首先学会推销自己。”因此针对不同的面试对象,自己认真准备好几个三分钟是有必要的。因此,自我表现时要充满自信,落落大方,态度诚恳。
问题:我们公司今年计划一般不招女学生
回答:贵公司的用人计划我了解,但我想性别差异并非是挑选人才的关键,还是要看个人的基本素质,何况我各方面表现都较优秀,有些男同学还赶不上我,而且女生在贵公司的职位更能显示女同学的优势。
点评:女同学碰到此类问题,不要愤怒、憎恨,要靠耐心和韧性,回答问题不要带怒意,要不卑不亢,充满自信,介绍自己的优势,有与男同学一比高低的勇气。
问题:在工作中你怎样看待错误?
回答:
1.我尽量不出错误
2.我并不担心自己会出错,但我能做到不重复同样的一个错误。
点评:对回答1的公司没有录用。
人非圣贤,熟能无过?错误是必不可少的,但关键是要能很快地吸取经验教训,总结经验。求职也如此,不要害怕失败,你应牢牢记住:“失败乃成功之母!”“失败是成功的踏脚石。”通往成功的路从不平坦,跌倒是难免的,但是,跌倒了并不是失败,真正的失败是跌倒了怕不起来了。”
问题:“会打 羽毛球 吗?”
“给你们一辆小轿车,有没有把握学会驾驶?”
“厨房里有蔬菜,你俩能不能给我做几样拿手的好菜?”
回答:
男:会 女:打的不好
男:有 女:不敢保证
男:没问题 女:做得不好
点评:
此应聘面试单位是一家中外合资公司,已经过了几道关卡的面试,此是最后复试,主考经理是外国人,以上是闲聊中随便地问了三个问题。最后,公司录用了男学生,淘汰了女学生。公司对女学生的评价是:有自卑情绪,缺乏自信心,无法胜任本公司职务。其实,该女同学是个不错的羽毛球选手。
问题:你救了我女儿,是我们家的救命恩人,对你的录用我们会优先考虑的。
回答:不,先生,你弄错了吧,我未曾救过任何人
考 官:年轻人,你说的很对,是我弄错了,我很欣赏你的诚实,我决定,不是优先,而是你的复试已经通过了
点评:此问题是考官设的一个“陷阱”。一个人的优秀品质会引起他人喜欢的,而诚实是招聘者看重的必备品质。因此大学生虽有良好的资历和优秀的学业成绩,更必备诚实的品格。
问题:如果你被录用,是否马上就可来上班?
回答:今天听到你的聘用邀请十分感激,但学校里学业还未全部结束,论文撰写正是关键的时候,还在准备论文答辩阶段,容我回去征求导师意见,看能否抽出时间上班,所以允许我明天正式回复。
点评:面对开门见山的质问,如当时无法确定答复,且自己未决定真正意愿应允,应考虑到事后可能还会有更让自己心动的工作机会。在回答时即应巧妙预设一个转弯的空间。同时,避免得罪对方而错失良机,这比“对不起,我还不能回答这个问题,我必须仔细考虑看看。”这种答复圆滑的多。
问题:听说你对XX工作(业务)很精通,不妨谈些你的看法吧?
回答:谈不上精通,只是略知一二,可以共同探讨一下。
点评:给自己留下一点回旋的余地。对于此类问题,特别要谨慎,这往往是一个“陷阱”,是主考官有意想进一步对求职者有更加深入的了解所设定的“圈套”。因此,求职者要小心回答问题,即使你真的对XX业务很精通,也千万不要自以为是,否则你将面临难度更大的问题。
问题:今天来参加面试的有近十位候选人,而我们只挑选二名,如何证明你是他们中最优秀的呢?
回答:恐怕不能一下子讲清,得具体情况具体分析,比如贵公司现在所最需要的是行政管理方面的人才,虽然前来应征的都是这方面的对口人才,但我深信我在大学四年中担任过的学生干部及组织过多次大型活动的经验已经为我打下了扎实的基础,我想这一点恐怕也是我自认为比较突出的一点。
点评:这样的回答可以说比较圆滑,以免主考官抓住某一“把柄”,再度发难。此问题是考察求职者随机应变的能力。无论你列举多少优点别人总有比你更多的优点,因此,你从正面去回答这样的问题毫无意义的。
问题:依你现在的水平,恐怕能找到比我们企业更好的公司吧?
回答:
1.“YES”说明你这个人“身在曹营心在汉。”
2.“NO”说明你的能力有问题或是对自己自信心不足,总之你会左右为难。而如果你说“不知道”或“不清楚”。则又拒绝回答之嫌。
3.“不可一概而论。”
“或许我能找到比贵公司更好的企业,但别的企业或许在对人才培养方面不如贵公司重视,机会也不如贵公司多,或许我找不到更好的企业,我想珍惜已有的最为重要的。”
点评:象上面这个问题以3回答最好,可以说把一个“模糊”的答案抛给主考官,做到滴水不漏。这类问题的特点是主考官设定了一个特定的背景式条件,让求职者作出回答,有时任何一种条件答案都不是很理想,这时就需要用模糊语言表示。
问题:你的面试通过了,现在我们签约。
回答:让我考虑一下,我要和父母商量过再决定。
点评:其实这是一种不成熟的回答,在应聘外企时不可取得,设想如果将来让这样的人代表公司和客户谈判,凡事都回公司请示 报告 ,到手的生意也会飞了。该同学是一个条件很不错的人选,应聘的是一家非常出名的跨国公司。她走后,公司马上通知了“替补队员”(为防意外,公司面试人数比正式录取的人数总多1—2名)那位小伙子看完公司聘函立即签了约。他表示,我就想到该公司工作。待女孩子回来。说跟家人商量好了,同意签约,而此时,那个职位已招到新人,就是那位替补队员。所以当机会来临时,千万要抓住,犹豫就会错失良机,后悔也无济于事。
问题:你谈恋爱了吗?你如何看待大学生谈恋爱?
回答:没有。我个人认为大学生最好不要谈恋爱,因为大学生毕竟不是很成熟,自控力比较差,因恋爱荒废学业、不求上进的大有人在,大学生应集中精力搞好学业、锻炼能力。
点评:通过这个问题来考察应试者的成熟程度和处理生活事务的能力,考察应试者的人生观和价值观。因此,应提高认识的层次,从用人单位领导的角度思考问题。
分享标题:go语言面试100道 go语言笔试题
文章URL:http://pwwzsj.com/article/hjjpoj.html