go语言多协程读取数据 golang 协程 多核( 四 )


通过上面的例子我们也发现每个协程并不需要从通道中读取对应类型的数据 , 只需让接收操作能执行就行 , 让select不被阻塞 。所以可以使用空结构体类型,我们可以改成如下:
这里我们只关注通道是否关闭这个信号,而不需要关注通道里面的数据,所以可使用空结构体类型通道 。
第二个要讨论的是nil通道:如果定义了一个channel变量没有被初始化,或者被赋值为nil,那么该chennel总是处于阻塞状态 。如下所示:
执行结果为:
因为channel为nil无法发送数据,当然也不能接收数据:
这个似乎看起来不是很重要,但是如果你想使用关闭channel来等待多个channel关闭的话 , 这个特性就有用处了 。先看下面的例子:
WaitMany()函数看起来好像是一个等待通道a和b关闭的好方法 , 但是存在一个问题 。假设a通道先关闭,case -a就会变成非阻塞 。因为bclosed还是false,程序就会进入到一个死循环当中,导致b通道永远无法确认关闭 。
一个安全的方法就是使用nil通道总是阻塞的特点 , 如下所示:
上面的例子我们在WaitMany函数当中,当a或者b关闭时,case可执行了将对应的通道赋值为nil,让其阻塞这样就可以等待另一个通道关闭 。当nil通道是select语句的一部分时,它会被有效地忽略,因此nil通道a会从select中删除它,只留下b,直到它被关闭,退出循环 。
总之,closed和nil通道的简单属性对写出优质的go程序是很有用的 , 可以用来创建高并发程序 。
go语言的map多协程访问时需要加锁吗go语言的map多协程访问时需要加锁
支持==和!=操作就可以做keygo语言多协程读取数据,实际上只有function、map、slice三个kind不支持作为keygo语言多协程读取数据,因为只能和nil比较不能和另一个值比较 。布尔、整型、浮点、复数、字符串、指针、channel等都可以做key 。
struct能不能做key要看每一个字段,如果所有字段都可以做key,那这个struct就可以 。有一个字段不能做key,这个struct就不能做key 。array也是 , 元素类型能做key,那这个array就可以 。
例如go语言多协程读取数据:
【go语言多协程读取数据 golang 协程 多核】 type Foo map[struct {
Bbool
Iint
Ffloat64
Ccomplex128
Sstring
P*Foo
Ch chan Foo
}]bool
每一个字段都可以做key,Foo就可以做key 。再如:
type Foo map[struct {
Fn func() Foo
Mmap[*Foo]int
S[]Foo
}]bool
有一个字段不能做key、Foo就不允许做key,而这三个字段都不能 。
字段是递归检查的:
type Foo map[struct {
Sub struct {
M map[*Foo]bool
}
}]bool
Sub的M字段不能做key,Sub就不能做key,Foo也就不能做key 。
总之想把一个数据结构用于map的key,就不能包含function、map和slice 。
go语言多协程读取数据的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于golang 协程 多核、go语言多协程读取数据的信息别忘了在本站进行查找喔 。

推荐阅读