go语言基础的数据结构

1. 数组和切片

  • 数组类型的值的长度是固定的,而切片类型的值是可变长的
  • 切片的类型字面量中只有元素的类型,而没有长度。切片的长度可以自动地随着其中元素数量的增长而增长,但不会随着元素数量的减少而减少
  • Append 函数总是会返回新的切片,而且如果新切片的容量比原切片的容量更大那么就意味着底层数组也是新的

2. map

  • go语言字典的键类型不可以是函数类型、字典类型和切片类型。Go语言规范规定,在键类型的值之间必须可以施加操作符 == 和 !=。也就是说,键类型的值必须要支持判等操作。由于函数类型、字典类型和切片类型的值并不支持判等操作,所以字典的键类型不能是这些类型。
  • 另,如果键的类型是接口类型的,那么键值的实际类型也不能是函数类型、字典类型和切片类型,否则会在程序中引发panic。
  • 因此,最好不要把字典的键类型设定为任何接口类型。如果键的类型是数组类型,那么还要确保该类型的元素类型不是函数类型、字典类型或切片类型。
  • 当我们试图在一个值为nil的字典中添加键 - 元素对的时候,Go 语言的运行时系统就会立即抛出一个 panic。
  • map 不是并发安全的

3. 通道

  • 通道类型的值是并发安全的
  • 一个通道相当于一个先进先出( FIFO )的队列。也就是说,通道中的各个元素都是严格的按照发送的顺序排列的,先被发送通道的元素值一定会被先接收。元素值的发送和接收使用操作符 <-
  • 对于同一个通道,发送操作之间是互斥的,接收操作之间也是互斥的
  • 发送操作和接收操作中对元素值的处理都是不可分割的
  • 发送操作在完全完成之前会被阻塞,接收操作也是如此
  • 对于有缓冲通道,如果通道已满,那么发送操作会被阻塞;如果通道已空,那么接收操作会被阻塞。
  • 对于值为nil 的通道,不论它的具体类型是什么,对它的发送操作和接收操作都会永久的处于阻塞状态,他们所属的goroutine 中任何代码都不会被执行。
  • 通道类型是引用类型,他的零值就是 nil
  • 通道关闭之后不能进行发送或接收、关闭一个已经关闭了的通道都会引发 panic 。
  • 除非有特殊的保障措施,我们千万不要让接收方关闭通道,而应当让发送方做这件事
  • <-chan 单向通道之只能收不能发—接收通道。chan-< 单向通道之只能发不能收—发送通道
  • 单向通道最主要的用途就是约束其他代码的行为

4. 闭包

  • 匿名的函数就是一个闭包函数
  • 闭包的意义表面上看是延迟实现了一部分程序逻辑或功能,实际上,是动态的生成那部分程序逻辑