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