go入门学习

GO入门学习

why

  • 语法简单;
  • 性能好;

常用类型

主要讲三种类型:

slice

go里面有数组类型。但开发过程中使用比较少。因为其元素类型确定,长度不可变,并且传递参数时是值拷贝;

slice是对底层数组的一段内容的引用:

1
2
data := [...]int{0,1,2,3,4,5,6}
slice := data[1:4:5] //[low:high:max]

避免在两个变量中修改同一个底层数组;可以这样修改:

1
2
3
4
v2 := make([]int, 6)
copy(v2, v1[0:6])
v3 := make([]int, 3)
copy(v3, v1[2:5])

channel

1
ch := make(chan int, 10)

创造一个长度为10,元素类型为int的管道;

  • 读 v := <- ch
  • 写 ch <- v
  • 关闭 close(ch)

目的是保证协程之间交换数据时,并发安全;

  • 长度为0的channel为不带buffer的channel
1
ch := make(chan int)

同时读写的时候,读会在写之前发生。也不会发生额外的数据拷贝。

  • 长度不为0的

写会在读之前发生;

interface

定义一个抽象的方法:

1
2
3
type Gun interface{
Shoot()
}
  • 作用:解耦,抽象

并发

通过通信来共享数据,而不是通过共享数据来通信。

context

这是一个接口,内部有几个方法。context是在多个协程之间传递,如何保证数据安全。

web服务端模型

接受一个请求,创建一个新的协程用于读写该连接上的数据,但这种方式在请求处理阻塞的情况下,容易引发协程爆炸。

性能分析

go提供了一些性能分析的工具

profile

  • cpu分析:每隔一段时间,记录当前正在运行的协程的栈,出现频率比较高的函数就是占用CPU比较多的;
  • mem分析:分析堆上申请内存的情况;

一般都是通过采样实现。

高效的go代码

  • 减少对象创建,减少内存分配;
  • sync.Pool
  • sync/atomic