博客文章

Golang Context包使用详解

在Golang使用过程中经常需要跟协程(goroutine)打交道,在Golang中可以很方便的创建协程,只需要在函数调用前面添加一个go关键字。但是golang本身并没有提供对协程本身进行控制的手段。比如需要在协程的创建者结束时同时结束其创建的协程。

context包在Golang 1.7时加入到标准库中。其设计目标是给Golang提供一个标准接口来给其他任务发送取消信号和传递数据。其具体作用为:

  • 可以通过context发送取消信号。
  • 可以指定截止时间(Deadline),context在截止时间到期后自动发送取消信号。
  • 可以通过context传输一些数据。

context在Golang中最主要的用途是控制协程任务的取消,但是context除了协程以外也可以用在线程控制等非协程的情况。

基本概念

context的核心是其定义的Context接口类型。围绕着Context接口类型存在两种角色:

  • 父任务:创建Context,将Context对象传递给子任务,并且根据需要发送取消信号来结束子任务。
  • 子任务:使用Context类型对象,当收到父任务发来的取消信号,结束当前任务并退出。

接下来我们从这两个角色的视角分别看一下Context对象。

继续阅读

Golang 1.9 新特性-类型别名(Type Aliases)

类型别名是Golang 1.9引入的新特性,顾名思义类型别名是给Golang的类型提供创建别名的方法。使用的语法如下:

设计初衷

类型别名的设计初衷是为了解决代码重构时,类型在包(package)之间转移时产生的问题(参考 Codebase Refactoring (with help from Go) )。

考虑如下情景:

项目中有一个叫p1的包,其中包含一个结构体T1。随着项目的进展T1变得越来越庞大。我们希望通过代码重构将T1抽取并放入到独立的包p2,同时不希望影响现有的其他代码。这种情况下以往的go语言的功能不能很好的满足此类需求。类型别名的引入可以为此类需求提供良好的支持。

继续阅读

Hello world!

一直以来从互联网获取着各种知识,慢慢充实着自己的大脑。慢慢的开始想写点什么回馈社会。于是重新走上了博客之路。

这次采用了全新的域名hao.io其中hao来自于我的名字当中的最后一个字。站点采用WordPress程序,托管在Google Cloud Platform,使用了其中的Compute Engine、Cloud SQL、Cloud Load Balancing、Cloud CDN等组件。

深知写博客贵在坚持,并且写博客能很好的提炼自己的想法,希望这次能多写一些内容,希望能帮助大家的同时能够比较好的提高自己。

继续阅读