Go语言的产生背景
最近十年来,C/C++在计算领域没有很好得到发展,并没有新的系统编程语言出现。对开发程度和系统效率在很多情况下不能兼得。要么执行效率高,但低效的开发和编译,如C++;要么执行低效,但拥有有效的编译,如.NET、Java ;所以需要一种拥有较高效的执行速度、编译速度和开发速度的编程语言,Go就横空出世了。
Go语言的最大优势就是执行速度和开发效率都很出色。而且从语言级别上支持并发。执行速度快是因为Go是编译型的静态语言,它在执行速度上比解释型语言具有先天优势,生产效率高是塞学Go的语法和结构简明,易学易用。
Go语言的核心特性
Go语言之所以厉害,是因为它在服务端的开发中,总能抓住程序员的痛点,以最直接、简单、高效、稳定的方式来解决问题,Go代码编译成机器码不仅非常迅速,还具有非常方便的垃圾收集机制和强大的运行时反射机制。 它是一个快速的、静态类型的编译型语言。
Go语言具有很强的表达能力,它简洁、清晰而高效。
(1)并发编程
- Go语言在并发编程方面比绝大多数语言要简洁不少,这一点是其最大亮点之一,也是其在未来进入高并发高性能场景的重要筹码。
- goLang的并发执行单元是一种称为goroutine的协程。协程又称微线程,比线程更轻量、开销更小,性能更高。操作起来非常简单。
- 语言级别提供关键字go用于启动协程,并且在同一台机器上回以启动成千上万个协程。协程间一般曲应用程序显式实现调度,上下文切换无需下到内核层,高效不少。协程间的通信靠独有的channel机制实现。
(2)内存回收(GC)
- 内存自动回收,再也不需要开发人员管理内存
- 开发人员专注业务实现,降低了心智负担
- 只需要new分配内存,不需要释放
GC过程:先stop the world,扫描所有对象判活,把可回收对象在一段bitmap区中标记下来,接着立即start the world,恢复服务,同时起一个专门gorountine,回收内存到空闲list中以备复用,不物理释放。物理释放由专门线程定期来执行。
GC瓶颈在于每次都要扫描所有对象来判活,待收集的对象数昌越多,速度越慢。
(3)内存分配
- 先分配一块大内存区域
- 大内存被切分成各个大小等级的块,放入不同的空闲list中
- 对象分配空间时从空闲list中取出大小合适的内存块
- 内存回收时,会把不用的内存重放回空闲list
- 空闲内存会按照一定策略合并,以减少碎片
(4)编译
目前Golang具有两种编译器
- 一种是建立在GCC基础上的Gccgo
- 另外一种事分别针对64位x64位和32位x86计算机的一套编译器(6G和8G)
编译会涉及到两个问题,编译速度和依赖管理
依赖管理方面,由于Go语言绝大多数第三方开源库都在github上,在代码的import中加上对应的github路径就可以使用了。库会默认下载到工程的pkg目录下。另外,编译时会默认检查代码中所有实体的使用情况。凡是没有使用到的package或者变量,都会编译不通过。
(5)网络编程
- socket用net.Dial(基于tcp/udp,封装了传统的connect、listen、accept等接口)
- http用http.Get/Post()
- rpc用client.call(‘class_name.method_name’, args, &reply)
(6)函数多返回值
- 允许函数返回多个值,在某些场景下,可以有效的简化编程。
- Go语言推荐的编程风格,是函数返回的最后一个参数为error类型(只要逻辑体中可能出现异常),这样,在语言级别支持多返回值,就很有必要了
(7)语言交互性
- 语言交互性指的是本语言是否能和其他语言交互,比如可以调用其他语言编译的库。
- Go可以和c程序交互。
Cgo允许开发者混合编写C语言代码,然后Cgo工具可以将这些混合的C代码提取并生成对于C功能的调用包装代码。
(8)异常处理
3个重要关键字defer、panic、recover
- defer是函数结束后执行,呈先进后出;
- panic是程序出现无法修复的错误时使用,但会让defer执行完;
- recover会修复错误,不至于程序终止。当不确定函数不会出错时使用defer+recover。
(9)其他
- 类型推导:定义变量时,var abc =10; 会被自动推导为 int 类型
- 接口interface :无需显示继承,推荐每个接口只有一两个方法
- defer机制:可以通过该关键字指定需要延迟执行的逻辑体
- “包”的概念:提高代码的可重复用性
- 交叉编译:比如你可以在运行Linux系统的计算机上,开发运行windows下运行的应用程序
Go语言的特色和优势
特色:
- 高效的并发编程
- 内存回收(GC)
- 编译速度快
- 函数多返回值
- 语言交互性
- 没有异常处理(Error is value)
优势:
- 学习曲线容易
- 效率:快速的编译时间,开发效率和运行效率高
- 并行和异步编程几乎没有痛点
- 自由高效:组合的思想、无侵入式的接口;强大的标准库;部署方便:二进制文件,Copy部署;稳定性。
为什么选择Go语言?
- 执行性能
- 开发效率