GO入门学习
why
- 语法简单;
- 性能好;
常用类型
主要讲三种类型:
slice
go里面有数组类型。但开发过程中使用比较少。因为其元素类型确定,长度不可变,并且传递参数时是值拷贝;
slice是对底层数组的一段内容的引用:
1 | data := [...]int{0,1,2,3,4,5,6} |
避免在两个变量中修改同一个底层数组;可以这样修改:
1 | v2 := make([]int, 6) |
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 | type Gun interface{ |
- 作用:解耦,抽象
并发
通过通信来共享数据,而不是通过共享数据来通信。
context
这是一个接口,内部有几个方法。context是在多个协程之间传递,如何保证数据安全。
web服务端模型
接受一个请求,创建一个新的协程用于读写该连接上的数据,但这种方式在请求处理阻塞的情况下,容易引发协程爆炸。
性能分析
go提供了一些性能分析的工具
profile
- cpu分析:每隔一段时间,记录当前正在运行的协程的栈,出现频率比较高的函数就是占用CPU比较多的;
- mem分析:分析堆上申请内存的情况;
一般都是通过采样实现。
高效的go代码
- 减少对象创建,减少内存分配;
- sync.Pool
- sync/atomic