如何学习Go编程语言的内部结构?为了noob

如何学习Go编程语言的内部结构?为了noob,go,Go,最近我参加了几次求职面试。第一个问我如何实现channel?,第二个问我如何实现goroutine?。正如您所猜测的,下一个问题是如何实现Go接口? 我已经使用围棋六个月了,但老实说,我从来都不关心或了解这些围棋的内部结构 我试图通过阅读Go的源代码来学习这些,但无法真正理解其精髓 所以问题是,对于围棋中的noob,我如何学习围棋的内部结构?最有组织的内部资源链接集合可能是: 除此之外,这些问题的答案不是一次性收集的,而是分散在不同的博客帖子中 切片内部构件: 管柱内部构件: 内部常量: 反思

最近我参加了几次求职面试。第一个问我如何实现channel?,第二个问我如何实现goroutine?。正如您所猜测的,下一个问题是如何实现Go接口?

我已经使用围棋六个月了,但老实说,我从来都不关心或了解这些
围棋的内部结构

我试图通过阅读Go的源代码来学习这些,但无法真正理解其精髓


所以问题是,对于围棋中的noob,我如何学习围棋的内部结构?

最有组织的内部资源链接集合可能是:

除此之外,这些问题的答案不是一次性收集的,而是分散在不同的博客帖子中

切片内部构件:

管柱内部构件:

内部常量:

反思洞察:

接口内部构件:

渠道实施:SO概述:

通道内部构件:

Map实施:SO概述:;还涉及:

映射内部:

让我警告你,你可能没有抓住面试官的真正意图

(免责声明:我不时对围棋程序员进行工作面试, 对于一个有点苛刻的项目,以下所有内容都是我个人的 世界观。尽管如此,我的奶牛工友们还是有同感;-))

大多数情况下,对于员工来说,准确地知道运行时(或编译器)的这一位或那一位是如何实现的是毫无价值的,部分原因是这一点可能会在将来的任何版本中发生变化,部分原因是 确实存在至少两个最新的Go实现(“gc套件”),以及 作为GCC的一部分),它们都可以自由实现特定的功能 以他们希望的任何方式

一个(明智的)面试官真正感兴趣的是 您是否了解特定核心功能的“原因”

比如说,当他们要求你解释频道是如何实现的, 他们应该感兴趣的是从你那里听到的是一个频道 提供同步,也可以提供缓冲。 所以你可以告诉他们一个频道就像 在无缓冲通道的情况下,受互斥锁保护的变量,-或 就像一个被互斥锁保护的片段。 然后加上使用频道而不是手工制作的结果 涉及互斥的解决方案是在通道上执行操作 可以使用
select
语句轻松组合,同时实现 没有通道的匹配功能是可能的(到那时 他们可能希望听到您关于
sync.Cond
)的消息 但它确实很麻烦而且容易出错

知道细节并不是完全没有价值的 许多渠道表示,他们知道自己的实施努力降低成本 在“快乐案例”中为同步付出的代价 (目前没有争议 一个goroutine访问一个频道的那一刻),它也很聪明 不要直接跳入内核,在内核中的锁上睡觉 “不幸的案例”,但我认为没有必要把这些细节背下来

这同样适用于goroutines。你应该保持一个清晰的画面在什么地方 是操作系统进程和其中运行的线程之间的区别, 什么上下文属于线程,也就是说,需要保存什么 并在线程之间切换时恢复。 然后是操作系统线程和“绿色线程”之间的区别 一个戈罗廷大多是。知道谁调度操作系统线程没关系 谁安排了goroutines,为什么后者更快。 goroutines(主要是网络)的好处是什么 集成到调度程序中的轮询器(请参阅), 第二个是动态堆栈,第三个是低上下文切换开销 大部分时间)

我的建议是通读@icza提供的清单

除了你所问的以外, 下面我将列出一个好的候选人名单 应按照从最容易到最难(摸索)的顺序熟悉:

  • 切片和
    追加的机制
    。你应该知道数组的存在 以及它们与切片的区别

  • 接口是如何实现的

  • Go字符串的二元性(给定
    s
    包含一个字符串, 通过
    对于i:=0;i
    over
    对于i,c:=range s{}

    另外:您应该知道可能包含哪些类型的数据字符串 UTF-8完全可以在其中包含任意二进制数据,但它不是 要求

    字符串
    []字节
    之间的差异

  • 阻塞I/O是如何实现的(对于网络;这是关于 netpoller集成到运行时中)

    了解处理非网络阻塞I/O和 一般来说,系统调用是一种奖励

  • 调度程序是如何实现的(那些在
    M
    s上运行
    G
    s的
    p
    s)


此GitHub回购将有助于了解go内部结构

你可以在这里获得所有与围棋相关的资源


Relevant:@zerkms是的,我去过那里,但我的意思是有没有低级的文档或教程?如果我在面试中遇到这样的问题,它会告诉我我不想在那里工作,因为他们问的(大部分)是无关的问题。另一方面,如果他们问“你将如何实现通道?”,这很有用,因为它探索了你的思维过程,而不是你反刍记忆信息的能力。说得好。我过去是一名面试官(Java),在问内部相关问题时,我从来都不是问应聘者是否知道实际细节,而是问他对上下文的一般知识和理解