一次糟糕的golang面试体验

airun · · 3029 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

因为现在的公司加班过于严重,一周五个工作日我有四个工作日是晚上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、闭包会引用自由变量,闭包内部在真正执行的时候才获取里面的值

未完待续


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:airun

查看原文:一次糟糕的golang面试体验

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3029 次点击  ∙  1 赞  
加入收藏 微博
14 回复  |  直到 2019-08-07 13:32:38
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传