上一篇Golang编译器漫谈(1)编译器和连接器我们谈到Golang编译器生成的目标文件其实是分为两部分,编译目标文件和链接目标文件。本篇我们就重点看一下其中的编译目标文件。
假设存在A、B两个package。A中存在语句import "B"
。当A进行编译时就需要B的编译目标文件,从中获取可以使用的函数定义,变量等信息。
上一篇Golang编译器漫谈(1)编译器和连接器我们谈到Golang编译器生成的目标文件其实是分为两部分,编译目标文件和链接目标文件。本篇我们就重点看一下其中的编译目标文件。
假设存在A、B两个package。A中存在语句import "B"
。当A进行编译时就需要B的编译目标文件,从中获取可以使用的函数定义,变量等信息。
编译原理、操作系统、图形学一直被认为是程序员的三大浪漫。其中编译原理被认为是计算机领域的屠龙科技。谷歌、苹果、微软等IT科技巨头都争相发展自己的语言并以此为基础发展自己的生态系统。《Golang编译器漫谈》系列文章以谷歌的Golang编译器作为研究对象,分析一个现代编译器的设计与实现。
在Golang使用过程中经常需要跟协程(goroutine)打交道,在Golang中可以很方便的创建协程,只需要在函数调用前面添加一个go
关键字。但是golang本身并没有提供对协程本身进行控制的手段。比如需要在协程的创建者结束时同时结束其创建的协程。
context
包在Golang 1.7时加入到标准库中。其设计目标是给Golang提供一个标准接口来给其他任务发送取消信号和传递数据。其具体作用为:
context
发送取消信号。context
在截止时间到期后自动发送取消信号。context
传输一些数据。context
在Golang中最主要的用途是控制协程任务的取消,但是context
除了协程以外也可以用在线程控制等非协程的情况。
context
的核心是其定义的Context
接口类型。围绕着Context
接口类型存在两种角色:
Context
,将Context
对象传递给子任务,并且根据需要发送取消信号来结束子任务。Context
类型对象,当收到父任务发来的取消信号,结束当前任务并退出。接下来我们从这两个角色的视角分别看一下Context
对象。
…
类型别名是Golang 1.9引入的新特性,顾名思义类型别名是给Golang的类型提供创建别名的方法。使用的语法如下:
1 2 | type AliasType = SomeType //给SomeType 创建别名AliasType |
类型别名的设计初衷是为了解决代码重构时,类型在包(package)之间转移时产生的问题(参考 Codebase Refactoring (with help from Go) )。
考虑如下情景:
项目中有一个叫p1
的包,其中包含一个结构体T1
。随着项目的进展T1
变得越来越庞大。我们希望通过代码重构将T1
抽取并放入到独立的包p2
,同时不希望影响现有的其他代码。这种情况下以往的go语言的功能不能很好的满足此类需求。类型别名的引入可以为此类需求提供良好的支持。