Golang/Gopher如何处理不同通道中的数据?
新的去,并确保即时通讯在正确的页面与渠道+并发我有一个结构Golang/Gopher如何处理不同通道中的数据?,go,Go,新的去,并确保即时通讯在正确的页面与渠道+并发我有一个结构 type Playlist struct { playList []*Song updateList chan *Song } 我有两个函数在单独的go例程中操作数据 第一种方法是,每当频道上发送指向歌曲的指针时,向播放列表中追加数据: func (p *Playlist) continuousUpdate() { go func (){ for newSong := range p.updateL
type Playlist struct {
playList []*Song
updateList chan *Song
}
我有两个函数在单独的go例程中操作数据
第一种方法是,每当频道上发送指向歌曲的指针时,向播放列表中追加数据:
func (p *Playlist) continuousUpdate() {
go func (){
for newSong := range p.updateList {
p.playlist = append(p.playlist, newSong)
}
}()
}
第二种情况是,每24小时就会有一个计时器滴答作响,从而将播放列表重置为空片段
func (p *Playlist) controlCurrentPlayList(c <-chan time.Time) {
go func(){
for {
<-c
p.playlist = make([]*Song, 0)
log.Println("Current playlist has reset")
}
}()
}
func(p*Playlist)controlCurrentPlayList(c由于从两个goroutine访问字段Playlist
,没有同步,因此存在竞争
竞赛检测器在运行时检测竞赛,而不是在构建时检测竞赛。在24小时重置计时器计时之前,不会检测到此竞赛
通过使用select语句组合两个goroutine,可以消除竞争:
for {
select {
case newSong := <-p.updateList:
p.playlist = append(p.playlist, newSong)
case <-c:
p.playlist = make([]*Song, 0)
log.Println("Current playlist has reset")
}
}
用于{
挑选{
case newSong:=因为字段播放列表
是从两个goroutine访问的,没有同步,所以存在竞争
竞赛检测器在运行时检测竞赛,而不是在构建时检测竞赛。在24小时重置计时器计时之前,不会检测到此竞赛
通过使用select语句组合两个goroutine,可以消除竞争:
for {
select {
case newSong := <-p.updateList:
p.playlist = append(p.playlist, newSong)
case <-c:
p.playlist = make([]*Song, 0)
log.Println("Current playlist has reset")
}
}
用于{
挑选{
案例新松:=