我觉得如果要考察一个人对一门语言的熟悉程度,少说也要涵盖这些方面:

  1. 语言基础是否学习完整?例:除了 mutex 以外还有那些方式安全读写共享变量?
  2. 语言基础是否足够扎实?例:无缓冲 chan 的发送和接收是否同步?
  3. 语言细节是否有过了解?例:golang 采用什么并发模型?体现在哪里?
  4. 语言生态是否进行关注?例:在 Vendor 特性之前包管理工具是怎么实现的?

考察基础经验,例:说说 golang 中常用的并发模式?
考察实际经验,例:JSON 标准库对 nil slice 和 空 slice 的处理是一致的吗?
考察学习历程,例:学习 Go 的主要途径?读过那些书?

记录下我马上直接想到的问题,算给自己出面试题做个笔记
如果要求是CS背景良好、写过20-30万行商用后台代码、1-2年go经验的,我问如下问题:

  1. 1.9/1.10中,time.Now()返回的是什么时间?这样做的决定因素是什么?
  2. golang的sync.atomic和C++11的atomic最显着的在golang doc里提到的差别在哪里,如何解决或者说规避?
  3. 1.11为止,sync.RWMutex最主要的性能问题最容易在什么常见场景下暴露。有哪些解决或者规避方法?
  4. 如何做一个逻辑正确但golang调度器(1.10)无法正确应对,进而导致无法产生预期结果的程序。调度器如何改进可以解决此问题?
  5. 列出下面操作延迟数量级(1ms, 10us或100ns等),cgo调用c代码,c调用go代码,channel在单线程单case的select中被选中,high contention下对未满的buffered channel的写延迟。
  6. 如何设计实现一个简单的goroutine leak检测库,可用于在测试运行结束后打印出所测试程序泄露的goroutine的stacktrace以及goroutine被创建的文件名和行号。
  7. 选择三个常见golang组件(channel, goroutine, [], map, sync.Map等),列举它们常见的严重伤害性能的anti-pattern。
  8. 一个C/C++程序需要调用一个go库,某一export了的go函数需高频率调用,且调用间隔需要调用根据go函数的返回调用其它C/C++函数处理,无法改变调用次序、相互依赖关系的前提下,如何最小化这样高频调用的性能损耗?
  9. 不考虑调度器修改本身,仅考虑runtime库的API扩展,如果要给调度器添加NUMA awareness且需要支持不同拓扑,runtime库需要添加哪些函数,哪些函数接口必须改动。
  10. stw的pause绝大多数情况下在100us量级,但有时跳增一个数量级。描述几种可能引起这一现象的触发因素和他们的解决方法。
  11. 已经对GC做了较充分优化的程序,在无法减小内存使用量的情况下,如何继续显着减低GC开销。
  12. 有一个常见说法是“我能用channel简单封装出一个类似sync.Pool功能的实现”。在多线程、high contention、管理不同资源的前提下,两者各方面性能上有哪些显着不同。
  13. 为何只有一个time.Sleep(time.Millisecond)循环的go程序CPU占用显着高于同类C/C++程序?或请详述只有一个goroutine的Go程序,每次time.Sleep(time.Millisecond)调用runtime所发生的事情。
  14. 一个Go程序如果尝试用fork()创建一个子进程,然后尝试在该子进程中对Go程序维护的一个数据结构串行化以后将串型化结果保存到磁盘。上述尝试会有什么结果?
  15. 请列举两种不同的观察GC占用CPU程度的方法,观察方法无需绝对精确,但需要可实际运用于profiling和optimization。
  16. GOMAXPROCS与性能的关系如何?在给定的硬件、程序上,如何设定GOMAXPROCS以期获得最佳性能?
  17. 一个成熟完备久经优化的Golang后台系统,程序只有一个进程,由golang实现。其核心处理的部分由数十个goroutine负责处理数万goroutine发起的请求。由于无法设定goroutine调度优先级,使得核心处理的那数十个goroutine往往无法及时被调度得到CPU,进而影响了处理的延迟。有什么改进办法?
  18. 列举几个近期版本runtime性能方面的regression。

Golang实际面试会问的一些问题

1、空struct{}是否使用过?会在什么情况下使用,举例说明一下。
2、在Go语言中,结构体是否能够比较?该如何比较两个结构体?如何比较两个接口?可以顺便查考一下代码实现。
3、使用Go语言编程实现堆栈和队列这两个数据结构,该如何实现。可以只说实现思路。
4、var a []int和a := []int{}是否有区别?如果有的话,具体有什么区别?在开发过程中使用哪个更好,为什么?
5、Go中,如何复制切片内容?如何复制map内容?如何复制接口内容?编程时会如何操作实现。
这些考察的都是基础知识,不涉及到任何的高级,高级的再另说。从这些基础问题上能看出面试者是否有实际的经验,这是其一;其二,问题都不难,通过这些题目能够看出来面试者对于基础知识掌握的是否牢固。

  1. 什么是goroutine,他与process, thread有什么区别?

  2. 什么是channel,为什么它可以做到线程安全?
    3. 了解读写锁吗,原理是什么样的,为什么可以做到?
    4. 如何用channel实现一个令牌桶?
    5. 如何调试一个go程序?
    6. 如何写单元测试和基准测试?
    7. goroutine 的调度是怎样的?
    8. golang 的内存回收是如何做到的?
    9. cap和len分别获取的是什么?
    10. netgo,cgo有什么区别?
    11. 什么是interface?