专业编程基础技术教程

网站首页 > 基础教程 正文

对比着学 Go 语言-基础:channel 综述

ccvgpt 2024-08-06 12:51:21 基础教程 10 ℃

定义

channel 是协程的通信机制。

片段示例

// 定义
ch := make(chan int)

// 读取,写入
ch <- x // 发送到 ch
x = <-ch // ch 中的值赋值到变量
<-ch // 删除 ch 中的值

// 关闭操作
close(ch)

4 种情况

  • 不带缓存的 Channels
  • 串联的 Channels
  • 单方向的 Channels
  • 带缓存的 Channels

如果 channel 的缓存是满的,则引发的结果是阻塞。

对比着学 Go 语言-基础:channel 综述

完整示例

  • 不带缓存的 Channel 使用
func main() {
    conn, err := net.Dial("tcp", "localhost:8000")
    if err != nil {
       log.Fatal(err)
    }
    done := make(chan struct{})
    go func() {
      io.Copy(os.Stdout, conn)
      log.Println("done")
      done <- struct{}{}
    }()
		mustCopy(conn, os.Stdin)
    conn.Close()
    <-done
}
  • 串联的 Channels


func main() {
  naturals := make(chan int)
  squares := make(chan int)
  
  go func() {
    for x := 0; ; x++ {
      naturals <- x
    }
  }()
  
  go func() {
    for {
      x := <-naturals
      squares <- x*x
    }
  }()
  
  for {
    fmt.Println(<-squares)
  }
}
  • 单方向的 Channels
func counter(out chan<- int) {
   for x := 0; x<100; x++ {
     out <- x
   }
   close(out)
}

func squarer(out chan<- int, in <-chan int) {
   for v := range in {
     out <- v*v
   }
   close(out)
}

func printer(in <-chan int) {
   for v := range in {
       fmt.Println(v)
   }
}

func main() {
    naturals := make(chan int)
    squares := make(chan int)
  
    go counter(naturals)
    go squarer(squares, naturals)
    printer(squares)
}
  • 带缓存的 Channels
func mirroredQuery() string {
    responses := make(chan string, 3)
    go func() { responses <- request("asia.gopl.io") }()
    go func() { responses <- request("europe.gopl.io") }()
    go func() { responses <- request("americas.gopl.io") }()
    return <-responses
}

func request(hostname string) (response string){...}

Tags:

最近发表
标签列表