这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记
go语言基础
语言基础
变量
go语言是一门强类型语言,每一个变量都有它自己的变量类型。变量类型包括字符串整数浮点型、布尔型等。 go语言里面的变量的两种声明:
- var name string =” "
- name:=" "。 go语言里面的常量,使用conts修饰,但它没有确定的类型,会根据使用的上下文来自动确定类型。
切片
切片有与数组相同的操作,但可以任意更改长度,可以用make来创建一个切片,用append来追加元素,切片还拥有像python切片操作,但不支持负数索引。
map
一种哈希字典,可以通过make来创建一个空map,注意的是它当中元素是无序的并不像c++中map是个有序集合
结构体
- 结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体,每个值称为结构体的成员。
- 结构体成员名字是以大写字母开头的,那么该成员就是导出的(类似于java和C++ 中public(导出)和private属性),一个结构体可能同时包含导出和未导出的成员。
- 可以用结构体的名称去初始化一个结构体变量, 构造的时候需要传入每个字段的初始值。也可以用这种键值对的方式去指定初始值,这样可以只对一部分字段进行初始化。
- 结构体能支持指针,这样能够实现对于结构体的修改,也可以在某些情况下避免一些大结构体的拷贝开销。
- 空结构体不占用空间,通常可以结合map实现set,以节省空间。
Channels
channels是goroutine之间的通信机制。一个channel是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发送值信息。和map类似,channel也对应一个make创建的底层数据结构的引用。当我们复制一个channel或用于函数参数传递时,我们只是拷贝了一个channel引用
- 不带缓存的Channels: 基于无缓存Channels的发送操作将导致发送者goroutine阻塞,直到另一个goroutine在相同的Channels上执行接收操作
- 串联的channel: Channels也可以用于将多个goroutine连接在一起,一个Channel的输出作为下一个Channel的输入。
- 带缓存的Channels:向缓存Channel的发送操作就是向内部缓存队列的尾部插入元素,接收操作则是从队列的头部删除元素。如果内部缓存队列是满的,那么发送操作将阻塞直到因另一个goroutine执行接收操作而释放了新的队列空间。相反,如果channel是空的,接收操作将阻塞直到有另一个goroutine执行发送操作而向队列插入元素。
并发编程
go语言具有天然的并发优势,能够轻易同时并发上百goroutine。goroutine可以通过channel通信,也可以利用无缓冲channel进行goroutine之间的同步。此外goroutine与主协程之间可以通过WaitGroup进行同步 主要利用以下方法:
- Add(delta int) 计数器标识主协程需要与多少个goroutine进行同步
- Done() 在协程中调用,标识协程完成,计数器减一
- Wait() 阻塞主协程,直到计数器减为0