第一章-Golang简介

··
热河fen青
热河fen青
是奋青,亦是愤青

1. 前导篇
#

1.1 不同版本的特性
#

参考文章:Go语言各版本特性回顾(1.5-1.14)-腾讯云开发者社区-腾讯云

1.2 核心特性
#

1.2.1 Go的特性
#

  1. 吸收和接纳其他语言的特性
  2. 在开发中,能够抓牢程序员的痛点,以简单直接且高效稳定的方式来解决问题
  3. 不仅编译迅速,还具有强大的垃圾收集机制和运行反射机制
  4. 快速的、静态类型的编译型语言,又有动态类型解释型语言的感觉
  5. 表达能力强:简洁清晰高效
  6. 思想:大道至简,小而蕴真

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语言诞生在互联网时代,故天生就具有去中心化、分布式等特性,其中一个具体表现就是提供了丰富的网络编程接口

  • socketnet.Dial(基于TCP/UDP,封装了传统的 connect``listen``accept等接口)
  • httphttp.Get()http.Post()
  • rpcclient.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要执行完,如除以0
  • recover:会修复错误,不至于程序种植,如果不确定函数会不会出错,就用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包供其执行
  • 交叉编译:不受系统限制