几道刁难人的笔试题

2020年12月16日 0 条评论 862 次阅读 2 人点赞

前言

最近在为公司出笔试题,准备面试未来应聘的 Golang 工程师。以下为个人精选的几道

先来一波数组

再来一波数组与切片结合的题

defer 机制题

第一部分:

解析:

 这里,有4个函数,他们的index序号分别为1,2,3,4。

那么这4个函数的先后执行顺序是什么呢?这里面有两个defer, 所以defer一共会压栈两次,先进栈1,后进栈2。 那么在压栈function1的时候,需要连同函数地址、函数形参一同进栈,那么为了得到function1的第二个参数的结果,所以就需要先执行function3将第二个参数算出,那么function3就被第一个执行。同理压栈function2,就需要执行function4算出function2第二个参数的值。然后函数结束,先出栈fuction2、再出栈function1.

​ 所以顺序如下:

  1. defer压栈function1,压栈函数地址、形参1、形参2(调用function3) --> 打印3
  2. defer压栈function2,压栈函数地址、形参1、形参2(调用function4) --> 打印4
  3. defer出栈function2, 调用function2 --> 打印2
  4. defer出栈function1, 调用function1--> 打印1

我们平日总是顺着思想,都认为defer是最后才执行的,其实这是错的,不信你仔细思考下面的代码

第二部分

解析:

  1. 创建变量t并赋值为1
  2. 执行return语句,注意这里是将t赋值给返回值,此时返回值为1(这个返回值并不是t)
  3. 执行defer方法,将t + 3 = 4
  4. 函数返回返回值1
  1. 将返回值t赋值为传入的i,此时t为1
  2. 执行return语句将t赋值给t(等于啥也没做)
  3. 执行defer方法,将t + 3 = 4
  4. 函数返回 4 ,因为t的作用域为整个函数所以修改有效。

上面的代码return的时候相当于将t赋值给了result,当defer修改了t的值之后,对result是不会造成影响的。

  1. 初始化返回值 t 为零值 0
  2. 首先执行 defer 的第一步,赋值 defer 中的 func 入参 t 为 0
  3. 执行 defer 的第二步,将 defer 压栈
  4. 将 t 赋值为 1
  5. 执行 return 语句,将返回值 t 赋值为 2
  6. 执行defer的第三步,出栈并执行
  7. 因为在入栈时defer执行的func的入参已经赋值了,此时它作为的是一个形式参数,所以打印为0;相对应的因为最后已经将t的值修改为2,所以再打印一个2

结语

这只能作为部分笔试题,不过如果能将上述笔试题全做对也代表着该开发者基础确实挺扎实的。但不包含理论面试,比如GC、runtime 调度 、逃逸分析、内存对齐、GPM 调度模型等。

有缘看到这篇文章的工程师们,你们答对了多少呢?

兰陵美酒郁金香

大道至简 Simplicity is the ultimate form of sophistication.

文章评论(0)

你必须 登录 才能发表评论