Multiplexing of Channels Based on Select in Golang

2022年11月13日 2069点热度 0人点赞 0条评论
内容目录

In the following example, the timer sends a message to the channel every 1 second. It will automatically terminate when the count reaches 10 times.

func main() {
	fmt.Println("Commencing countdown.")
	tick := time.Tick(1 * time.Second)
	for countdown := 10; countdown > 0; countdown-- {
		v := <-tick
		fmt.Println(countdown, v)
	}
}

file

However, if it is necessary to cancel midway, the select statement must be used. Its format is as follows:

select {
case <-ch1:
    // ...
case x := <-ch2:
    // ...use x...
case ch3 <- y:
    // ...
default:
    // ...
}

If default is used in the select, it means that at the time of entering the select, one of the cases must be ready; otherwise, it will execute the default code as soon as it enters the select.

The select statement will be executed only once.

If there is no default in the select, and none of the channels have content when entering the select, then the select will block.

After improvements, the code example for canceling execution is as follows:

package main

import (
	"bufio"
	"fmt"
	"os"
	"time"
)

func main() {
	stop := make(chan int)
	go tick(stop)
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Scan()
	stop <- 0
	fmt.Println("已结束")
}

func tick(stop chan int) {

	fmt.Println("Commencing countdown.")
	tick := time.Tick(1 * time.Second)

	for countdown := 10; countdown > 0; countdown-- {
		select {
		case v := <-tick:
			{
				fmt.Println(countdown, v)
				break
			}
		case <-stop:
			return
		}
	}
}

痴者工良

高级程序员劝退师

文章评论