Go语言的语言特性
1.2.1 并发编程
Go 语言引入了goroutine
,它是 Go 实现快速高效的并发编程的关键。通过调用 go 关键字,我们就可以让函数以 goroutine 的方式进行运行,也就是以协程为单位进行运行。协程比线程更加的轻量级,也更节省系统资源,这使得我们可以创建大量的 goroutine,从而进行轻松且高质量的并发编程。同时,goroutine 内部采用管道channel
进行消息传递,从而实现共享内存。
1.2.2 错误处理
Go 语言中的错误处理的哲学和 C 语言一样,函数通过返回错误类型(error
)或者bool
类型(不需要区分多种错误状态时)表明函数的执行结果,调用检查返回的错误类型值是否是nil
来判断调用结果。并引入了 defer 关键字用于标准的错误处理流程,并提供了内置函数panic
、recover
完成异常的抛出与捕捉。
f := func(x,y int) int {
return x+y
}
第一个hello world程序
package main
import (
"fmt" //导入fmt包,调用其中的Println()函数
)
func main() {
fmt.Println("Hello,world!")
}
运行的时候
go run hello.go
1.2.3 内存回收GC
内存自动回收不需要开发人员担心,自动回收垃圾
GC过程:
- 首先stop the world
- 扫描所有对象进行判活
- 把可回收对象在一段bitmap里面标记下来
- 接着立即start the world恢复服务
- 同时起一个线程goroutine
- 将回收内存放到空闲的list中进行备用
- 不进行物理释放,物理释放由专门的线程来执行
GC的瓶颈:
在于每次都要收集所有的对象进行判活,收集的对象越多,速度越慢,随着版本会不断优化
内存分配:
- 首先分配一个大内存区域
- 大内存会被企鹅分为各个大小等级的块,放入不同的空闲list中
- 对象分配空间是从空闲的list中取出大小合适的内存块
- 内存回收时,会把不用的内存从放回空闲的list
- 空闲内存会按照一定的策略合并,以减少碎片
1.2.4 编译
目前的golang的编译器是有两种,一种是基于gcc的Gccgo,还有一种是针对于64位x64和32位x86计算机的一套编译器
库的引入
go的很多第三方库都在github上面,所以只需要引入github上的路径就可以,库就会下载到工程的pkg目录下面,说明需要go编程的时候需要联网,但是也是很方便的。
1.2.5 网络编程接口
go语言的网络编程接口十分的丰富
- socket: net,Dial(基于tcp/udp ,封装了传统的connect 、listen、accept等接口)
- http: 使用http.Get / Post
- rpc使用client.Call
函数多返回值
支持多个返回值,可以简化编程
语言交互性
Go语言可以和c程序的交互,开发者完全可以忽略c语言和go之间的差异
异常处理
go不支持try catch 因为可能会被滥用,导致代码量的增加
go里面的异常处理是如果是普通异常,查看返回的error对象
如果是比较严重的异常,比如除零等,重点性panic。使用defer panic recover
来修复异常
其他的有趣类型特性
1.go语言是强类型的,但是支持类型的自动推导
2.go是有interface的机制,只需要实现这个接口里面的函数就可以,不需要显示的写出继承关系。go推荐interface只提供一到两个方法
3.defer机制
可以使用改关键字制定需要延迟执行的逻辑体,也就是说在函数体return前或者出现panic之前使用。对defer引用可以简化编程,提高可读性。
4.包的机制 main只有一个
5.交叉编译 源码都是utf-8的格式编码 国际化!!