Go语言不足 - 蘭陵N散記

作者:JerryXia | 发表于 , 阅读 (0)
最近公司是在疯狂地推广Go语言,我也是推广小组成员。Go语言的确很多的优点,这里并不想表扬Go语言,而是说说它的不足。
生态不成熟一个语言的流行,都有其背后的推动者。Go语言是由Google公司创建与推动。最近我司的高层也亲自拜访了Go语言的主创人员。Google称目前已有100+的App从Java转向Go。Google内部主要有三大语言(C++、Java、Python),之前对Go语言的公司内部的政治意义大于它的实际使用。近两年来,语言的战略地位凸显,不断地在推动Go语言的应用。
目前主要使用Go语言的公司是一些创业公司或互联网公司。而这些公司采用Go语言非技术的因素主要有:
公司软件资产积累少,不存在切换其它语言成本,使用Go语言可以轻装上阵;互联网公司的技术人员流动大,Go语言面向开发简化,招人容易,上手快;采用Go语言的技术因素主要有:
Go语言在语言级通过Goroutine与网络IO的Netpoller的封装,能大在简化高并发的网络应用开发,而互联网的应用都以HTTP、网络通讯应用为主;Go语言标准库丰富,能满足互联网应用的常用应用场景:不需要太多的业务逻辑,偏网络接...阅读全文

理解Go Context机制 - 蘭陵N散記

作者:JerryXia | 发表于 , 阅读 (0)
什么是Context最近在公司分析gRPC源码,proto文件生成的代码,接口函数第一个参数统一是ctx context.Context接口,公司不少同事都不了解这样设计的出发点是什么,其实我也不了解其背后的原理。今天趁着妮妲台风妹子正面登陆深圳,全市停工、停课、停业,在家休息找了一些资料研究把玩一把。
Context通常被译作上下文,它是一个比较抽象的概念。在公司技术讨论时也经常会提到上下文。一般理解为程序单元的一个运行状态、现场、快照,而翻译中上下又很好地诠释了其本质,上下上下则是存在上下层的传递,上会把内容传递给下。在Go语言中,程序单元也就指的是Goroutine。
每个Goroutine在执行之前,都要先知道程序当前的执行状态,通常将这些执行状态封装在一个Context变量中,传递给要执行的Goroutine中。上下文则几乎已经成为传递与请求同生存周期变量的标准方法。在网络编程下,当接收到一个网络请求Request,处理Request时,我们可能需要开启不同的Goroutine来获取数据与逻辑处理,即一个请求Request,会在多个Goroutine中处理。而这些Goro...阅读全文

理解Go Interface - 蘭陵N散記

作者:JerryXia | 发表于 , 阅读 (0)
只要某个类型实现了接口所有的方法,那么我们就说该类型实现了此接口。该类型的值可以赋给该接口的值。作为1的推论,任何类型的值都可以赋值给空接口interface{}。接口的特性是Go语言支持鸭子类型的基础,即“如果它走起来像鸭子,叫起来像鸭子(实现了接口要的方法),它就是一只鸭子(可以被赋值给接口的值)”。凭借接口机制和鸭子类型,Go语言提供了一种有利于类、继承、模板之外的更加灵活强大的选择。只要类型T的公开方法完全满足接口I的要求,就可以把类型T的对象用在需要接口I的地方。这种做法的学名叫做”Structural Typing“。
方法Go语言中同时有函数和方法。一个方法就是一个包含了接受者的函数,接受者可以是命名类型或者结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集。
type User struct {Name  stringEmail string}func (u User) Notify() error// User 类型的值可以调用接受者是值的方法damon := User{"AriesDevil", "ariesdevil@xxoo.com"}d...阅读全文

Goroutine Local Storage - 蘭陵N散記

作者:JerryXia | 发表于 , 阅读 (0)
背景最近在设计调用链与日志跟踪的API,发现相比于Java与C++,Go语言中没有原生的线程(协程)上下文,也不支持TLS(Thread Local Storage),更没有暴露API获取Goroutine的Id(后面简称GoId)。这导致无法像Java一样,把一些信息放在TLS上,用于来简化上层应用的API使用:不需要在调用栈的函数中通过传递参数来传递调用链与日志跟踪的一些上下文信息。
在Java与C++中,TLS是一种机制,指存储在线程环境内的一个结构,用来存放该线程内独享的数据。进程内的线程不能访问不属于自己的TLS,这就保证了TLS内的数据在线程内是全局共享的,而对于线程外却是不可见的。
在Java中,JDK库提供Thread.CurrentThread()来获取当前线程对象,提供ThreadLocal来存储与获取线程局部变量。由于Java能通过Thread.CurrentThread()获取当前线程,其实现的思路就很简单了,在ThreadLocal类中有一个Map,用于存储每一个线程的变量。
ThreadLocal的API提供了如下的4个方法:
public T ge...阅读全文

入园家长沟通会 - 蘭陵N散記

作者:JerryXia | 发表于 , 阅读 (0)
时间真是过得太快,转眼儿子要上幼儿园了。昨天是第一次参加儿子的入园家长沟通会。
上幼儿园的意义上幼儿园是小孩步入社会第一步,是融入世界的起点。脱离原生家庭才能独立成长,幼儿园有孩子同龄的伙伴,可以让孩子收获不同的体验;幼儿园也有专业的老师,可以让孩子快乐自由的探索自己,认识朋友,体验世界。
我平时的工作都比较忙,基本都是早七晚九,白天小孩要么是跟他奶奶,要么是跟他外婆。还好他妈妈是小学老师,晚上能投入一些时间与他相处。大家居住环境比较封闭,邻里来往不多, 小孩基本都是呆在家里的时间居多。他对家的依赖比较多。虽他平时也会经常去他妈妈工作的小学玩,但还是在大家的完全监控下。养孩子的最终目的是为了看着他们独立,幼儿园是教孩子独立的第一步,也是教家长放手的第一步。
幼儿园与家长的关系现在的媒体会经常报道一些幼儿园的老师是怎么不负责的,同时家长也不太可能放心让孩子在外面受丁点的苦。在幼儿园只要有些风吹草动,就会造成冲突。作为家长,先要信任,再及时沟通。
诚然,当今的社会的幼儿园也是一个趋利机构,在知识学习上急功近利,拔苗助长。我个人是不太在乎小孩在幼儿园是否能学到多少知识,而是关心他过得...阅读全文