这个分情况。 一种是不依赖于语言的,比如我,是从PHP转到go的。没有任何开发go的经验,面试时一方面靠的是自己之前的业务领域对口,一方面自学了一些golang的知识。再就是计算机的基础知识,包括操作系统,数据结构和算法等。

下面就只针对纯golang的面试职位的情况来进行说明。这种情况一般会问到golang的以下几个方面:

map的底层结构:map的输出为什么是无需的,如何才能让输出有序;map是什么时候会扩容。

slice:slice又称动态数组,依托数组实现,可以方便的进行扩容和传递,实际商用时比数组更灵活。因为灵活,也容易出错,避免出错的方法之一就是了解其实现原理。

包括slice的容量和长度之间的区别是什么;append的原理;slice的扩容机制。如何初始化一个slice。slice的默认值是什么等等

channel数据结构:管道的底层原理、管道在读取和写入时的阻塞条件。管道一般结合select使用。如下是缓冲管道的示意图。


内存管理:内存是如何分配的、垃圾回收机制以及逃逸分析。

并发控制:并发是go中的一大特点,也是编程中的一大难点。如何写出并发安全的代码是对程序员的挑战。所以,在go中提供了内存共享并发控制原语,以及通道通信模型。

接口及反射:接口让go语言具有了扩展性。凡是实现了接口中方法的结构体都可以进行相互转换。

反射又是基于接口的,通过接口存储的具体的数据类型和方法来做到反射。

异常处理:在go中没有像java那样的try...catch...之类的异常捕获机制。go中将error作为一个普通的值返回。所有要求开发者对每个错误进行处理。

协程:了解什么是协程,如何启动一个协程,协程的调度模型,以及协程的调度策略。推荐阅读:极简单GMP模型说明