Go语言的语言特性

1.2.1 并发编程

Go 语言引入了goroutine,它是 Go 实现快速高效的并发编程的关键。通过调用 go 关键字,我们就可以让函数以 goroutine 的方式进行运行,也就是以协程为单位进行运行。协程比线程更加的轻量级,也更节省系统资源,这使得我们可以创建大量的 goroutine,从而进行轻松且高质量的并发编程。同时,goroutine 内部采用管道channel进行消息传递,从而实现共享内存。

1.2.2 错误处理

Go 语言中的错误处理的哲学和 C 语言一样,函数通过返回错误类型(error)或者bool类型(不需要区分多种错误状态时)表明函数的执行结果,调用检查返回的错误类型值是否是nil来判断调用结果。并引入了 defer 关键字用于标准的错误处理流程,并提供了内置函数panicrecover完成异常的抛出与捕捉。

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过程:

  1. 首先stop the world
  2. 扫描所有对象进行判活
  3. 把可回收对象在一段bitmap里面标记下来
  4. 接着立即start the world恢复服务
  5. 同时起一个线程goroutine
  6. 将回收内存放到空闲的list中进行备用
  7. 不进行物理释放,物理释放由专门的线程来执行

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的格式编码 国际化!!