因为现在的公司加班过于严重,一周五个工作日我有四个工作日是晚上11点以后才能下班,偶尔可能会到凌晨一点,两点...甚至到四点,第二天还要正常到公司。因为实在有点扛不住了就公开了下简历,准备重新看看外面的情况。
然后就有好几个猎头找到了我,我就把我的简历给了他们;后来呢有一个猎头给我推荐一个一家公司(位于五角场附近,我本身也就附近住)所以就没多考虑准备过去看看;时间定在了周五下午3点。后来这个猎头又找我说这家公司需要在简历上涉及到三个问题;猎头就把三个问题给到了我问我会不会,我看完之后感觉没什么问题就简短的回答了下给了他;面试时间依然是周五下午3点钟
三个问题
1.并发达到1万/秒怎么做TCP的连接管理?
2.消息中间件如果异常,造成数据丢失怎么处理?
3.并发量持续增长的情况下,怎么保证原有服务不受影响?
按时到了猎头给我的公司地址,然后爬楼梯到了面试的楼层。给面试官打了电话告知我的所在位置,开始了漫长的等待,期间也没看到前台什么的(本来想着会不会有一个漂亮的前台美眉给我倒杯水,缓解缓解面试前的紧张感),等了大概有20分钟。
有一个中年大叔拿着几张纸,一台笔记本电脑然后带我到一个小桌子旁边做下;他把手上的两张纸给到我让我先做做题目,我看了下纸上有五道题,其实都比较简单;有两道题比较有意思
1、下面的代码会输出什么?
str := "123"
str[0] = 'a'
([]byte)(str)[1] = `b`
fmt.Printf("%v", str)
我的第一反应是比较懵逼的,我从来没有用过这种骚操作;所以我的回答是
str := "123"
str[0] ='a' //回答:(这里完成赋值之后str的值应该是 a23)经过验证,这里会报错,没有这种操作
([]byte)(str)[1]='b' //回答:(这里赋值之后str的值应该还是 a23 )
//这里因为是蒋str转换成了[]byte对str没有影响所以str的值不会改变
2、下面代码会输出什么?(这道题是我跟面试官产生分歧的一道题)
m := map[string]int{
"a":1,
"b":2,
"c":3,
}
for k,v := range m {
go func(kk * string,vv * int) {
fmt.Printf("%v,%v",*kk,*vv)
}(&k,&v)
}
我:这个地方输出顺序不确定会输出什么,只有在闭包真正执行的时候指针kk跟vv里面存在是什么就会输出什么
面试官:回答错误,这个地方应该永远都是数据m中最后一个k跟v的值
我:不可能的,这个地方看编译器跑的快还是慢了,闭包在真正执行的时候kk跟vv究竟在for循环中跑到那个k,v了
后面因为这个问题我们争论了一会儿
最后面试官说:这是我经过编译器验证过的,不是从网上抄的是不可能出错的;你有自己的想法很好,但是要尊重事实
这个问题考察了两个点
1、map的顺序不是固定的
2、闭包会引用自由变量,闭包内部在真正执行的时候才获取里面的值
未完待续