Golang✔️走进 Go 语言✔️ 第十九课 错误处理 & 时间处理

Posted 我是小白呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang✔️走进 Go 语言✔️ 第十九课 错误处理 & 时间处理相关的知识,希望对你有一定的参考价值。

【Golang】✔️走进 Go 语言✔️ 第十九课 错误处理 & 时间处理

概述

Golang 是一个跨平台的新生编程语言. 今天小白就带大家一起携手走进 Golang 的世界. (第 19 课)

错误处理

在 Go 语言中, 使用的是一个单独的返回值来传达错误, 于传统的语言不同. 错误是最后一个返回值, 并有类型: error. 通过对它们实现Error()方法, 可以使用自定义类型作为错误.

定义:

type error interface {
    Error() string
}

除数为零错误


解决方法:

package main

import "fmt"

// 结构体
type DividedError struct {
	numerator int  // 分子
	denominator int  // 分母
}

// Error接口, 处理任何类型错误, 返回字符串结果
func (de *DividedError)Error() string {
	strFormat := "分母不能为 0"
	return fmt.Sprint(strFormat, de.denominator)
}

// 定义除法函数
func Divide(numerator int, denominator int) (result int, errorMsg string){
	if denominator == 0 {
		error_data := DividedError{numerator, denominator}
		errorMsg = error_data.Error()
		return
	} else {
		return numerator / denominator, "ok"
	}
}

func main() {

	// 100除以10
	result1, error1 := Divide(100, 10)
	if error1 == "ok" {
		fmt.Println("结果:", result1)
	} else {
		fmt.Println("错误:", error1)
	}

	// 除数为0
	result2, error2 := Divide(1, 0)
	if error2 == "ok" {
		fmt.Println("结果:", result2)
	} else {
		fmt.Println("错误:", error2)
	}

}

输出结果:

结果: 10
错误: 分母不能为 00

时间处理

计时器代表未来的一个事件, 可告诉计时器您想要等待多长时间. 计时器为我们提供了一个通道,在特定的时间执行对应的程序.

timer

timer 是定时器, 每到固定的时间后会执行一次

例子:

package main

import (
	"fmt"
	"time"
)

func main() {

	// 创建计时器
	timer1 := time.NewTimer(time.Second * 5)
	<- timer1.C  // 阻塞, 5秒后继续执行
	fmt.Println("wait")

	// 创建计时器
	timer2 := time.NewTimer(time.Second * 5)
	go func() {
		<- timer2.C
		fmt.Println("timer2 过期")
	}()

	// time.Sleep(time.Second * 10)

	// 阻断time2
	stop2 := timer2.Stop()
	if stop2 {
		fmt.Println("time2 终止")
	}

}

输出结果:

wait
time2 终止

ticker

ticker 只要定义完成, 从此刻开始计时, 不需要任何其他操作. 每隔固定时间都会触发.

例子:

package main

import (
	"fmt"
	"time"
)

func main() {

	// ticker
	ticker := time.NewTicker(time.Second)

	// 协程
	go func() {
		for t := range ticker.C {  // 定时干活

			fmt.Println("tick", t)
		}
	}()

	// 等待10s, 使得协程能够运行
	time.Sleep(time.Second * 10)
	ticker.Stop()
	fmt.Println("gameover")

}

输出结果:

tick 2021-08-17 01:28:19.7360444 -0400 EDT m=+1.004053601
tick 2021-08-17 01:28:20.7480858 -0400 EDT m=+2.016095001
tick 2021-08-17 01:28:21.7338822 -0400 EDT m=+3.001891401
tick 2021-08-17 01:28:22.7356228 -0400 EDT m=+4.003632001
tick 2021-08-17 01:28:23.7374798 -0400 EDT m=+5.005489001
tick 2021-08-17 01:28:24.7394163 -0400 EDT m=+6.007425501
tick 2021-08-17 01:28:25.7412068 -0400 EDT m=+7.009216001
tick 2021-08-17 01:28:26.7425907 -0400 EDT m=+8.010599901
tick 2021-08-17 01:28:27.7444257 -0400 EDT m=+9.012434901
gameover
tick 2021-08-17 01:28:28.7462812 -0400 EDT m=+10.014290401

速率限制


方法 1:

package main

import (
	"fmt"
	"time"
)

func main(){

	// 创建通道
	requests := make(chan int, 5)

	// 发送任务
	for i := 0; i < 5; i++ {
		requests <- i
		fmt.Println("发送任务:", i)
	}

	// 关闭通道
	close(requests)

	// 限制通道, 每200ms接收一个数据
	limiter := time.Tick(time.Millisecond * 200)

	// 接收任务
	for request := range requests{

		// 每200ms接收一个数据
		<- limiter
		fmt.Println("request", request, time.Now())
	}

}

输出结果:

发送任务: 0
发送任务: 1
发送任务: 2
发送任务: 3
发送任务: 4
request 0 2021-08-17 02:50:33.6029614 -0400 EDT m=+0.207132401
request 1 2021-08-17 02:50:33.8014898 -0400 EDT m=+0.405660801
request 2 2021-08-17 02:50:34.006185 -0400 EDT m=+0.610356001
request 3 2021-08-17 02:50:34.2114027 -0400 EDT m=+0.815573701
request 4 2021-08-17 02:50:34.4003125 -0400 EDT m=+1.004483501

方法 2:

package main

import (
	"fmt"
	"time"
)

func main(){

	// 时间限制器
	time_limiter := make(chan time.Time, 3)

	// 发送时间
	go func() {
		for t := range time.Tick(time.Millisecond * 200) {
			time_limiter <- t
			fmt.Println("发送任务:",  t)
		}
	}()

	// 请求限制器
	requests_limiter := make(chan int, 5)
	for i := 0; i < 5; i++ {
		requests_limiter <- i
	}

	// 关闭通道
	close(requests_limiter)

	for request := range requests_limiter{

		// 时间限制, 间隔200ms
		<- time_limiter
		fmt.Println("request", request, time.Now())
	}

}

输出结果:

request 0 2021-08-17 02:48:51.6795088 -0400 EDT m=+0.207010401
发送任务: 2021-08-17 02:48:51.6792399 -0400 EDT m=+0.206741501
request 1 2021-08-17 02:48:51.8787624 -0400 EDT m=+0.406264001
发送任务: 2021-08-17 02:48:51.8786156 -0400 EDT m=+0.406117201
发送任务: 2021-08-17 02:48:52.0836354 -0400 EDT m=+0.611137001
request 2 2021-08-17 02:48:52.0837566 -0400 EDT m=+0.611258201
发送任务: 2021-08-17 02:48:52.2883148 -0400 EDT m=+0.815816401
request 3 2021-08-17 02:48:52.2883909 -0400 EDT m=+0.815892501
发送任务: 2021-08-17 02:48:52.4776006 -0400 EDT m=+1.005102201
request 4 2021-08-17 02:48:52.4776447 -0400 EDT m=+1.005146301

以上是关于Golang✔️走进 Go 语言✔️ 第十九课 错误处理 & 时间处理的主要内容,如果未能解决你的问题,请参考以下文章

Golang✔️走进 Go 语言✔️ 第十课 数组

Golang✔️走进 Go 语言✔️ 第十课 数组

Golang✔️走进 Go 语言✔️ 第九课 局部变量 vs 全局变量

Golang✔️走进 Go 语言✔️ 第九课 局部变量 vs 全局变量

Golang✔️走进 Go 语言✔️ 第十四课 排序

Golang✔️走进 Go 语言✔️ 第十四课 排序