学习Go语言的目的是为了让我们读懂代码,当生产系统遇到故障点时候,我们能够从代码点级别找到根本点原因。
统一思想-12 factors
有一个著名的原则在指导整个微服务架构体系,就如上图所示。
I. 基准代码 一份基准代码,多份部署
代码驱动整个部署,在以前的项目管理当中,项目管理是非常混乱的,生产系统出现故障之后经常找不到原始代码,一份代码多份部署就是部署在多个平台的代码在仓库里面保留一份。这样生产系统出现故障可以找到具体的版本。
II. 依赖 显式声明依赖关系
一些传统的语言,比如c语言,c语言里面有.c和.h文件,一个是你真正写业务逻辑的地方,一个是头文件,头文件只做声明。
但是它的依赖关系是没办法通过一个声明文件来声明点,比如写一个程序,没有办法说明要依赖于哪个文件和什么版本,这使得整个项目到后期的依赖管理就非常的混乱。
如java和go,都有依赖声明点机制,可以定义依赖于你的a模块,或者依赖于b模块的哪个版本,如果要梳理项目点依赖关系就只需要看这个项目的声明文件就行了。
III. 配置 在环境中存储配置
鼓励配置和代码分离,如果我们要修改代码,比如java,代码编译为字节码,变成war包。
如果是go和c,编译出来的可能是可执行文件,这一部分是代码点部分。这部分代码在运行的时候
可能会需要读取一些配置,这些配置通常是文本文件。
这样的好处是在生产系统变更时候,如果是代码变更,需要走整个流水线的,需要将源代码进行构建和测试,再根据流水线的定义发布到测试环境,预生产环境,生产环境,这个流程是比较重的。
但是对于配置来说点话,如果修改配置,这个配置有时候是可以在生产系统进行的。
VI. 进程 以一个或多个无状态进程运行应用
鼓励应用以一个以多个无状态的进程去运行,这样好处是进程都是无状态的,它不依赖于数据,当应用进程出现问题的时候可以随意去停止进程,并且使用新的进程替换它。
上面都是云原生和微服务点指导思想。尽量将数据变为没有数据依赖的,无状态的。当一个进程出现问题的时候可以轻易的替换它。
为什么需要Go语言
Go 语言的原则
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 语言特性衍生来源
包定义:同一类相关的文件可以放到相关的目录,这些目录可以将其命名为一个一个的包
支持接口抽象,但是不支持接口继承,定义一个接口,在接口里面可以定义一系列的function,
然后可以定义不同的对象,然后为不同的对象实现这些接口方法。这样就将一系列的行为抽象出来了,其次有不同的对象实现这些接口,它们具有不同的行为。
Csp多线程模型:启动一系列轻量级用户态的协程,彼此之间通过管道去做通信。