学习Go语言的目的是为了让我们读懂代码,当生产系统遇到故障点时候,我们能够从代码点级别找到根本点原因。


统一思想-12 factors


Go 语言的由来、特性_Go

 有一个著名的原则在指导整个微服务架构体系,就如上图所示。



I. 基准代码  一份基准代码,多份部署


代码驱动整个部署,在以前的项目管理当中,项目管理是非常混乱的,生产系统出现故障之后经常找不到原始代码,一份代码多份部署就是部署在多个平台的代码在仓库里面保留一份。这样生产系统出现故障可以找到具体的版本。



II. 依赖   显式声明依赖关系


一些传统的语言,比如c语言,c语言里面有.c和.h文件,一个是你真正写业务逻辑的地方,一个是头文件,头文件只做声明。



但是它的依赖关系是没办法通过一个声明文件来声明点,比如写一个程序,没有办法说明要依赖于哪个文件和什么版本,这使得整个项目到后期的依赖管理就非常的混乱。



如java和go,都有依赖声明点机制,可以定义依赖于你的a模块,或者依赖于b模块的哪个版本,如果要梳理项目点依赖关系就只需要看这个项目的声明文件就行了。




III. 配置   在环境中存储配置



鼓励配置和代码分离,如果我们要修改代码,比如java,代码编译为字节码,变成war包。



如果是go和c,编译出来的可能是可执行文件,这一部分是代码点部分。这部分代码在运行的时候



可能会需要读取一些配置,这些配置通常是文本文件。




这样的好处是在生产系统变更时候,如果是代码变更,需要走整个流水线的,需要将源代码进行构建和测试,再根据流水线的定义发布到测试环境,预生产环境,生产环境,这个流程是比较重的。




但是对于配置来说点话,如果修改配置,这个配置有时候是可以在生产系统进行的。






VI. 进程   以一个或多个无状态进程运行应用



鼓励应用以一个以多个无状态的进程去运行,这样好处是进程都是无状态的,它不依赖于数据,当应用进程出现问题的时候可以随意去停止进程,并且使用新的进程替换它。




上面都是云原生和微服务点指导思想。尽量将数据变为没有数据依赖的,无状态的。当一个进程出现问题的时候可以轻易的替换它。


为什么需要Go语言


Go 语言的原则



Go 语言的由来、特性_多核_02


Go尽量点将语法精简,把实现精简,这样对开发者来说相对友好。

 


为什么需要 Go 语言


其他编程语言的弊端。


  • 硬件发展速度远远超过软件。(现有的语言对多核支持不友好)
  • C 语言等原生语言缺乏好的依赖管理 (依赖头文件,c语言的很多依赖是基于头文件的,非常难定义去依赖于哪一个模块和什么版本,最后c语言的依赖会变的非常复杂,也容易因为版本的问题导致生产故障)
  • Java 和 C++ 等语言过于笨重(虽然解决了依赖管理点问题,但是要去写一个java程序,很多时候java的基本包是无法满足你的需求点,那么你就需要依赖于一个非常重的框架去做,这使得你启动任何点小项目都会变成一个非常重的项目)
  • 系统语言对垃圾回收和并行计算等基础功能缺乏支持
  • 对多核计算机缺乏支持(代码写完之后是没有充分利用计算机里面的cpu资源的)


Go 语言是一个可以编译高效(在编译的时候可以充分的利用多核),支持高并发的(由于协程,所以在单节点上启动几十万上百万的协程都是可能的,对并发的支持会非常的强大),面向垃圾回收(不太需要关心内存回收和泄漏)的全新语言。



  • 秒级完成大型程序的单节点编译。
  • 依赖管理清晰。
  • 不支持继承,程序员无需花费精力定义不同类型之间的关系。
  • 支持垃圾回收,支持并发执行,支持多线程通讯。
  • 对多核计算机支持友好。


1. 为什么需要 Go 语言



Go 语言不支持的特性


• 不支持函数重载和操作符重载


• 为了避免在 C/C++ 开发中的一些 Bug 和混乱,不支持隐式转换


• 支持接口抽象,不支持继承


• 不支持动态加载代码


• 不支持动态链接库(这样的好处就是程序一旦编译出来,就可以直接运行,付出的代价就是依赖的包可能会有些大)


• 通过 recover 和 panic 来替代异常机制(简单的error,需要你使用的时候,给其赋值一个message,message是什么,error就是什么)


• 不支持断言


• 不支持静态变量


 


如果你没做过其他语言的开发,那么恭喜,以上大部分复杂的问题,在go语言里不存在,你也无需关心。


 

 

 

 


Go 语言特性衍生来源


Go 语言的由来、特性_依赖管理_03

包定义:同一类相关的文件可以放到相关的目录,这些目录可以将其命名为一个一个的包

支持接口抽象,但是不支持接口继承,定义一个接口,在接口里面可以定义一系列的function,


然后可以定义不同的对象,然后为不同的对象实现这些接口方法。这样就将一系列的行为抽象出来了,其次有不同的对象实现这些接口,它们具有不同的行为。

Csp多线程模型:启动一系列轻量级用户态的协程,彼此之间通过管道去做通信。