Golang / Gopher如何操纵不同渠道的数据?

时间:2015-08-12 22:23:05

标签: go

新的去确保我在右侧页面上有通道+并发我有一个结构

type Playlist struct {
  playList   []*Song
  updateList chan *Song
}

我有2个函数可以在单独的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")
    }
  }()
}

两个独立的通道是否处理数据的同步?或者我可以很容易地遇到竞争条件?

go build -race并且没有出现错误。

1 个答案:

答案 0 :(得分:5)

因为从两个没有同步的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")
    }
 }