GO基础进阶篇 (十一)、select及定时器timer

通道类型在go中其他方法里的应用

1.select

在Go语言中,select语句是一种用于处理多个通信操作的机制。它允许一个goroutine等待多个通信操作中的任何一个完成,并执行相应的代码块。select语句用于处理并发的多个通道操作,使得程序能够以非阻塞的方式等待多个通信操作中的任意一个完成。

select语句的基本语法如下:

select {
case channel1 <- message1:
    // 当channel1准备好时执行的代码块
case channel2 <- message2:
    // 当channel2准备好时执行的代码块
case message3 := <-channel3:
    // 当channel3准备好时执行的代码块
default:
    // 当没有任何通道准备好时执行的代码块
}

select语句中的每个case代表一个通信操作。select语句会阻塞,直到其中一个case可以执行。如果有多个case可以执行,那么会随机选择一个。

以下是一个使用select语句处理两个通道的简单示例:

package main

import (
	"fmt"
	"time"
)

func main() {
	ch1 := make(chan int)
	ch2 := make(chan int)

	go func() {
		time.Sleep(2 * time.Second)
		ch1 <- 100
	}()

	go func() {
		time.Sleep(2 * time.Second)
		ch2 <- 100
	}()

	select {
	case num1 := <-ch1:
		fmt.Println("ch1", num1)
	case num2 := <-ch1:
		fmt.Println("ch2", num2)
		//default:
		//	fmt.Println("没匹配到")
	}
}

在这个例子中,select语句等待从ch1ch2通道接收消息,哪个通道先准备好就执行相应的代码块。

2.定时器timer

package main

import (
	"fmt"
	"time"
)

func main() {
	timer := time.NewTimer(3 * time.Second)

	fmt.Println(1, time.Now())
	//定时3秒,三秒后触发
	timerChan := timer.C
	fmt.Println(2, <-timerChan)

	//提前结束定时器

	timer2 := time.NewTimer(5 * time.Second)
	go func() {
		<-timer2.C //5S
		fmt.Println("子进程结束")
	}()

	time.Sleep(2 * time.Second)
	stop := timer2.Stop() //提前结束
	if stop {
		fmt.Println("子进程提前结束")
	}
	
}
time.After timer.AfterFunc
package main

import (
	"fmt"
	"time"
)

func main() {
	timerChan := time.After(3 * time.Second)

	fmt.Println(time.Now())

	chantime := <-timerChan
	fmt.Println(chantime) //3秒后触发更新时间(通过channel)

	time.AfterFunc(time.Second*3, test)
	time.Sleep(time.Second * 5)
}

func test() {
	fmt.Println(time.Now())
	fmt.Println("aaaaa")
}

你可能感兴趣的:(GO语言从基础到应用,golang,开发语言,后端)