Golang笔记——数据结构篇

1、通道(Channel)

1.1、声明与初始化

var ch chan int	// 声明通道变量

ch1 := make(chan string)	// 初始化无缓冲通道
ch1 := make(chan string, 5)	// 初始化有缓冲通道

1.2、用法

ch := make(chan int, 5)
ch <- 5			// 流入通道
t := <-ch		// 流出通道
t, ok := <-ch	// 流出通道(当ch被关闭且ch内没有缓冲数据时,ok为false)

func ChanParam(ch chan int) {}      // 通道可读写
func ChanParam(ch chan<- int) {}    // 只能从通道读取数据
func ChanParam(ch <-chan int) {}    // 只能向通道写如数据

1.3、知识点

  • 从无缓冲区通道或有缓冲区但缓冲区为空的通道读取数据会阻塞,直到有其他协程向通道写入了数据。
  • 向无缓冲区通道或有缓冲区但缓冲区已满的通道写入数据会阻塞,直到有其他协程从通道读取了数据。
  • 对于值为nil的管道,无论读写都会阻塞,而且是永久阻塞。
  • 内置函数 len()cap() 作用于管道,分别用于查询缓冲区中数据的个数及缓冲区的大小。
  • 会引发panic的操作:
    1. 关闭值为nil的管道。
    2. 关闭已经关闭的管道。
    3. 向已经关闭的管道写入数据。

1.4、实现原理

TODO
https://goplay.tools/snippet/cpR-Eh4d9Hd

2、切片(Slice)

2.1、声明与初始化

// 方法一:变量声明
var s []int                     // 零值nil

// 方法二:字面量
s1 := []int{}                   // 空切片
s2 := []int{1, 2, 3}            // 长度为3的切片
s3 := []int{8: ""}              // 使用索引声明切片

// 方法三:内置函数make()
s1 := make([]int, 0)            // 空切片
s1 := make([]int, 12)           // 指定长度
s1 := make([]int, 12, 100)      // 指定长度和空间

// 方法四:切取
array := [5]int{1, 2, 3, 4, 5}  // 初始化数组
s1 := array[0:2]                // 从数组中切取
s1 := s1[0:1]                   // 从切片中切取

2.2 用法

TODO

2.3 知识点

TODO

2.4 实现原理

TODO

切片=只想底层数组的指针+长度(len)+容量(cap)

3、映射(Map)

4、结构体(Struct)

5、自增常量(iota)

6、字符串(String)


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 nz_nuaa@163.com
github