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的操作:
- 关闭值为nil的管道。
- 关闭已经关闭的管道。
- 向已经关闭的管道写入数据。
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