go语言基础|青训营笔记

70 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记

go语言基础

语言基础

变量

go语言是一门强类型语言,每一个变量都有它自己的变量类型。变量类型包括字符串整数浮点型、布尔型等。 go语言里面的变量的两种声明:

  1. var name string =” "
  2. name:=" "。 go语言里面的常量,使用conts修饰,但它没有确定的类型,会根据使用的上下文来自动确定类型。

切片

切片有与数组相同的操作,但可以任意更改长度,可以用make来创建一个切片,用append来追加元素,切片还拥有像python切片操作,但不支持负数索引。

map

一种哈希字典,可以通过make来创建一个空map,注意的是它当中元素是无序的并不像c++中map是个有序集合

结构体

  1. 结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体,每个值称为结构体的成员。
  2. 结构体成员名字是以大写字母开头的,那么该成员就是导出的(类似于java和C++ 中public(导出)和private属性),一个结构体可能同时包含导出和未导出的成员。
  3. 可以用结构体的名称去初始化一个结构体变量, 构造的时候需要传入每个字段的初始值。也可以用这种键值对的方式去指定初始值,这样可以只对一部分字段进行初始化。
  4. 结构体能支持指针,这样能够实现对于结构体的修改,也可以在某些情况下避免一些大结构体的拷贝开销。
  5. 空结构体不占用空间,通常可以结合map实现set,以节省空间。

Channels

channels是goroutine之间的通信机制。一个channel是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发送值信息。和map类似,channel也对应一个make创建的底层数据结构的引用。当我们复制一个channel或用于函数参数传递时,我们只是拷贝了一个channel引用

  1. 不带缓存的Channels: 基于无缓存Channels的发送操作将导致发送者goroutine阻塞,直到另一个goroutine在相同的Channels上执行接收操作
  2. 串联的channel: Channels也可以用于将多个goroutine连接在一起,一个Channel的输出作为下一个Channel的输入。
  3. 带缓存的Channels:向缓存Channel的发送操作就是向内部缓存队列的尾部插入元素,接收操作则是从队列的头部删除元素。如果内部缓存队列是满的,那么发送操作将阻塞直到因另一个goroutine执行接收操作而释放了新的队列空间。相反,如果channel是空的,接收操作将阻塞直到有另一个goroutine执行发送操作而向队列插入元素。

并发编程

go语言具有天然的并发优势,能够轻易同时并发上百goroutine。goroutine可以通过channel通信,也可以利用无缓冲channel进行goroutine之间的同步。此外goroutine与主协程之间可以通过WaitGroup进行同步 主要利用以下方法:

  1. Add(delta int) 计数器标识主协程需要与多少个goroutine进行同步
  2. Done() 在协程中调用,标识协程完成,计数器减一
  3. Wait() 阻塞主协程,直到计数器减为0