大家好我是小西,从今天开始,我将开始更新Go基础篇的笔记
预计有5篇,基础篇写完了,再写应用篇,大致是这个计划
老手可以回顾回顾 ,温故知新~ 新手可以收藏一下 做个参考
今天更新第四篇,内容是 Go 泛型与并发
泛型
泛型简单来说,就是函数类型参数,一般用T表示
在定义函数时 T 的类型是不确定的,函数调用时T才确定为具体的类型
观察一下 Index 函数,[Tcomparable]表示T 必须是一个可比较的值 comparable 是一个约束
这让Index 函数既可以接收不同的类型,又以至于太灵活
并且这样的约束清晰可读,增加了代码的可维护性,这就是函数泛型达到的效果
泛型也可以在struct 中用,比如我们定义一个 List 的单向链表
内部的 val 的类型是不确定的,用T表示,any 约束,可以是任何类型,
这个any 不可以省略,泛型参数[T any] 位于List 后
注意给带泛型结构 添加方法时,方法名后不需要单独再写 [T any], 因为前面接收者 (l *List[T]) 已经有约束了
泛型结构体的使用
这里有两种初始化,当你也可以使用 new(List[int]) 这样的写法来返回一个指针Go routine 与并发
Go routine 是一个轻量级线程,由Go runtime 运行时来管理
Go 关键字 + 函数调用,就可以创建一个 go routine
Go routine 一般 channel来配合使用,使用前使用 make 函数创建
17 和 18 行创建了两个 go runtine , 他们向 channel c 发送数据 ,但是会有先后之分
注意 19 行的 x,y := <-c, <-c channel 是阻塞的,这个赋值不是一次完成的,等第一个 go routine 完成会一次赋值,第二个 go routine 完成会再完成一次赋值
Channel 也可以是带缓冲的ch := make(chan int, 100) channel 可以放100 个值
下面介绍两个channel 注意点:
一是通道的主动关闭, 需要调用 close 函数
二是 channel 和 range 的配合使用
注意只有发送方可以关闭 channel使用 close 函数
一般情况下,你不用调用 close 来关闭channel , 除非使用 for range c 这样的语法
最后
关于并发的内容还有点多,比如select 和 default 分支,以及sync.Mutex 锁,我们下期见~, 你可以点文章下的合集来看往期的内容~