1. 前导篇#
1.1 不同版本的特性#
参考文章:Go语言各版本特性回顾(1.5-1.14)-腾讯云开发者社区-腾讯云
1.2 核心特性#
1.2.1 Go的特性#
- 吸收和接纳其他语言的特性
- 在开发中,能够抓牢程序员的痛点,以简单直接且高效稳定的方式来解决问题
- 不仅编译迅速,还具有强大的垃圾收集机制和运行反射机制
- 快速的、静态类型的编译型语言,又有动态类型解释型语言的感觉
- 表达能力强:简洁清晰高效
- 思想:大道至简,小而蕴真
1.2.2 核心特性1-并发编程#
在当今这个时代,并发编程的意义不言而喻,因此Golang具有以下并发编程特点
- 简洁程度要胜过绝大多数语言,这是最大的亮点之一,他也是未来进入高并发高性能场景的重要筹码
- 不同于传统的多进程和多线程,golang的并发执行单元是一种称为goroutine的协程,语言级别关键字
go
用于启动协程,并且在同一台机器上启动成千上百个协程;协程间一般由应用程序显示调度,上下文切换无需下到内核层,使得更加高效,通信靠独有的channel机制实现
1.2.3 内存回收(GC)#
- 内存自动回收,再也不需要开发人员管理内存。回收过程如下:
- 首先stop the world, 扫描所有对象判活,把可回收对象在一段bitmap区中标记下来
- 接着立即start the world,回复服务,同时启动一个专门的gorountine,回收内存到空闲list中以备复用
- 开发人员专注业务实现,降低心智负担
- 只需要new分配内存,无需物理释放(它由专门线程顶起来执行);
- GC瓶颈在于每次都要扫描所有对象来判活,带收集对象越多,速度越慢;其性能会随版本更新而不断优化
1.2.4 内存分配#
- 先分配一块大内存区域
- 大内存被分成各个大小等级的块,放入不同的空闲list中
- 对象分配空闲时从空闲list中取出大小合适的内存块
- 内存回收时,会把不用的内存重放会空闲list
- 空闲内存机制按照一定策略合并,以减少碎片
1.2.5 编译#
目前Golang具有两种编译器
- Gccgo,建立在GCC基础之上
- 另一种是针对x64和x86计算机的一套编译器(6g和8g)
- 依赖管理,在代码中的
import
中加上github路径即可,库默认下载到pkg目录上 - 编译时默认会检查代码中所有尸体的使用情况,凡是没用到的package或变量,一定会编译不通过;这确保了go语言的严谨性
1.2.6 网络编程#
Go语言诞生在互联网时代,故天生就具有去中心化、分布式等特性,其中一个具体表现就是提供了丰富的网络编程接口
socket
用net.Dial
(基于TCP/UDP,封装了传统的connect``listen``accept
等接口)http
用http.Get()
或http.Post()
rpc
用client.Call('class_name.method_name', args, &reply)
- 重要能力:自带高性能HttpServer,通过几行代码就可以得到一个基于协程的高性能Web服务,更重要的是,维护成本极低,没有任何依赖
1.2.7 函数多返回值#
这个是Go语言与其他传统语言在函数方面上的其中一个区别
- 允许函数返回多个值,在某些场景下,可以有效简化编程
- 由于其官方推荐在函数返回的最后一个参数为error类(只要在逻辑中体现异常),这才有必要要求允许返回多个值
1.2.8 语言交互性#
- 定义:本语言是否可以和其他语言交互,比如可以调用其他语言编译的库
- Go可以与C程序交互,交互工具叫Cgo,它还可以允许开发者混合编写C语言代码,然后Cgo工具可以把混写的代码提取并生成对于C功能的调用包装代码,开发者可以完全忽略而这边界如何跨越的
1.2.9 异常处理#
为防止代码量增加以及被滥用(不管多小的异常都要抛出),Go不支持 try ... catch
块,Go处理方式为 defer...recover...panic
defer
:函数结束后执行,呈先进后出panic
:程序出现无法修复的错误时使用,但defer要执行完,如除以0recover
:会修复错误,不至于程序种植,如果不确定函数会不会出错,就用defer+recover- 若异常严重,由Go语言内部自动抛出,用户无需抛出,如果使用
panic(str)
就会退化到try-catch块那种模式
1.2.10 其他特性#
- 类的推导,可以用var来定义变量(注意:虽然可以用var,但Go毕竟是强类型语言)
- interface,一个类型只要实现了某个interface的所有方法,即可实现该interface,无需显示继承;Go编程规范推荐每个接口类只提供1-2个方法,这样使每个接口类的目的非常清晰
defer
:Go语言关键字,可通过它指定需要延迟执行的逻辑体(在函数体return前或出现panic执行),这种机制适合善后逻辑处理(如资源泄露)- “包"的概念:和python相同,把相同功能代码放到一个目录,称之为包,包可以被其他包引用,每个程序只有一个main包供其执行
- 交叉编译:不受系统限制