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")
    }
 }
用于{
挑选{
案例新松:=