Pysolate Spine中文旁白 + HTML 图解全部小课 ↗

知识小点 · 解开一个疑问

Go channel:先写结果,再 close(done)

看清结果盒与通知 channel 的分工:先发布结果,再关闭 done;多个等待者都能继续。

01 / 05

结果和通知先分开

两个盒子,各有自己的工作

准备播放
GORESULT / NOTIFY · 先写结果,再关通知准备
RUNNABLE EXAMPLE两个 waiter 等一个完成点
执行第 10–13 行

          
          package main
        
          
          
        
          
          import (
        
          
              "fmt"
        
          
              "sync"
        
          
          )
        
          
          
        
          
          func main() {
        
          
              result := 0
        
          
              done := make(chan struct{})
        
          
              var waiters sync.WaitGroup
        
          
              waiters.Add(2)
        
          
              for i := 1; i <= 2; i++ {
        
          
                  go func(id int) {
        
          
                      defer waiters.Done()
        
          
                      <-done
        
          
                      fmt.Println("waiter", id, "reads", result)
        
          
                  }(i)
        
          
              }
        
          
              result = 42
        
          
              close(done)
        
          
              waiters.Wait()
        
          
          }
        

这是可运行的完整示例;省略的只是解释,不是代码。

PUBLISH PROTOCOL结果盒和通知 channel
两步发布
DATA / 结果盒0结果还没写入
SIGNAL / done channel等待关闭只负责发完成信号

先准备两个独立的等待者。

接收方等待 done
waiter 1准备等待—
waiter 2准备等待—
OBSERVED还没有输出

result 放数据,done 只放完成信号。

执行位置0.0 s0%
旁白

点一下播放即可。也可以只听声音,或拖动进度跳到想看的位置。

0:001:19

正在准备本课音轨与图解。首次播放需要点一下。

跳到某一节 / 查看讲稿