为了账号安全,请及时绑定邮箱和手机立即绑定

Golang/Gopher 如何操作不同通道中的数据?

Golang/Gopher 如何操作不同通道中的数据?

Go
浮云间 2021-11-01 14:15:53
新来并确保我在正确的页面上使用通道 + 并发我有一个结构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 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

因为该字段playlist是从两个没有同步的 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")

    }

 }


查看完整回答
反对 回复 2021-11-01
  • 1 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信