Go学习笔记-管道

xiaoxiao2021-02-28  75

一.管道

功能:实现并发线程之间的通信,可以将值从一个线程传递到另一个线程

用法:

创建: make(chan val-type)赋初值: channel <- val传递值: val <- channel

示例代码:

package main import "fmt" func main() { messages := make(chan string) go func() { messages <- "ping"}() msg := <-messages fmt.Println(msg) } 运行输出: $go run channels.go ping

二.管道缓存

功能:缓存管道中的数据,使得一个管道可以传递多个缓存值

用法:

创建: make(chan val-type, num) // num表示缓冲区大小赋初值: channel <- val值传递: val <- channel

示例代码:

package main import "fmt" func main() { messages := make(chan string, 2) messages <- "buffered" messages <- "channel" fmt.Println(<-messages) fmt.Println(<-messages) }

三.管道同步

功能:通过管道来实现线程之间的同步

用法:

当线程发现管道输出时值为空时便会阻塞线程,直到另一线程有值输入时才会将其唤醒

示例代码

package main import "fmt" import "time" func worker(done chan bool) { fmt.Print("working...") time.Sleep(time.Second) fmt.Println("done") done <- true } func main() { done := make(chan bool, 1) go worker(done) <-done } //正常输出working...done,当把最后一句<-done去掉后便不再输出

四.管道定向

功能:作为函数参数时指定管道的传输方向

用法:

在定义管道时连同传输方向一起定义

示例代码

package main import "fmt" func ping(pings chan<- string, msg string) { pings <- msg } func pong(pings <-chan string, pongs chan<- string ) { msg := <-pings pongs <- msg } func main() { pings := make(chan string, 1) pongs := make(chan string, 1) ping(pings, "passed message") pong(pings, pongs) fmt.Println(<-pongs) }

五.Select选择管道

功能:当有多个因为管道未赋值而被阻塞的情况时,选择最先被响应的那种情况执行

用法

select{ case 阻塞情况: 执行内容 case 阻塞情况: 执行内容 ... }

示例代码

package main import "time" import "fmt" func main() { c1 := make(chan string) c2 := make(chan string) go func(){ time.Sleep(time.Second * 1) c1 <- "one" }() go func(){ time.Sleep(time.Second * 2) c2 <- "two" }() for i := 0; i < 1; i++{ select{ case msg1 := <-c1: fmt.Println("received", msg1) case msg2 := <-c2: fmt.Println("received", msg2) } } }
转载请注明原文地址: https://www.6miu.com/read-75524.html

最新回复(0)