一次糟糕的golang面试体验

airun · 2019-08-04 23:32:39 · 3166 次点击 · 预计阅读时间 1 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2019-08-04 23:32:39 的文章,其中的信息可能已经有所发展或是发生改变。

因为现在的公司加班过于严重,一周五个工作日我有四个工作日是晚上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

3166 次点击  ∙  1 赞  
加入收藏 微博
14 回复  |  直到 2019-08-07 13:32:38
ustbdiego
ustbdiego · #1 · 6年之前

这个面试官有点2b

wy666
wy666 · #2 · 6年之前

这个面试官第二题肯定是错了。他测试少了

package main

import (
    "fmt"
    "time"
)

func main() {
    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 \n",*kk,*vv)
        }(&k,&v) //d
    }    // this is fine 3
    time.Sleep(1 * time.Second)
}

多运行几次能够得到三种不同结果

b,2 b,2 b,2

c,3 c,3 c,3

a ,1 a ,1 a ,1 ```

zjf_sdnu
zjf_sdnu · #3 · 6年之前

想知道开始的3个问题如何回答?

reacerland
reacerland · #4 · 6年之前

面试官明显不懂golang,第二个问题明显输出是不确定的

jan-bar
jan-bar · #5 · 6年之前

我觉得多逛逛和多试试这三个都是很基础的。不过我要么是自己遇到过,要么是网上看别人遇到过自己再试一试。总的感觉上面几个题都是很基础吧。

worldwalk
worldwalk · #6 · 6年之前

这个面试官思路有问题,思维逻辑不顺畅,自己试的可能只是一种情况,怎么还理直气壮的以为自己试的就是对的,就是代表全部? 并且还不是从理论上探讨,仅强调自己试出来的。。。

JaxSONG
JaxSONG · #7 · 6年之前

我比较在意这三个问题的答案: 1.并发达到1万/秒怎么做TCP的连接管理? 2.消息中间件如果异常,造成数据丢失怎么处理? 3.并发量持续增长的情况下,怎么保证原有服务不受影响?

comcn1949
comcn1949 · #8 · 6年之前

我比较在意前三个问题的答案 +1 

yuanchangxing
yuanchangxing · #9 · 6年之前

我比较在意前三个问题的答案 +1 

itchin
itchin · #10 · 6年之前

我的理解是这样的,第一个问题, str[0] = 'a' ([]byte)(str)[1] = b 由于等号左边表达式不可寻址,过不了编译。

第二个问题,我第一反应是没输出,因为主线程会比协程更快结束。上边也有人说了,加个sleep...

xiaoxiao666
xiaoxiao666 · #11 · 6年之前

我比较在意前三个问题的答案 +1 

focussoft
focussoft · #12 · 6年之前

楼主的基础确实有点薄弱。 第一道题答错了有点可惜。 第二道题先不论闭包和golang的指针操作。 只是说编译器跑得快还是慢就知道楼主不是正经的科班出身, 或者基础确实不好了。 至于猎头给的三个题目纯属脑洞发散的题目。 没有标准答案的。

streamingmind
streamingmind · #13 · 6年之前

第一题的代码有两处错误:

  1. string是immutable的,不能改变,编译出错:cannot assign to str[1]
  2. 赋值语句左边是 []byte 的元素,同属byte类型,而右边是字串类型,同样也会编译出错:cannot use "b" (type string) as type byte in assignment
GUI1573
GUI1573 · #14 · 6年之前

老哥,你也是在上海的么?我这边有一个GO语言服务器端的岗位,有兴趣聊一下不? 微信:13922116841。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传