Go语言开发小技巧&易错点100例(十七)

本期分享:

1.Go定时任务

2.Cgo简单使用


Go定时任务

在Go语言中,定时任务(也称为定时器或cron作业)具有多种作用,这些作用在应用程序的开发和运维中非常有用。以下是一些常见使用场景:

1.任务调度:定时任务可以在特定的时间点执行特定的任务,如定时清理临时文件、定时备份数据等。这对于维护系统状态和数据安全至关重要。定时任务还可以按照固定的时间间隔重复执行某个任务,例如每隔一段时间更新缓存数据或检查系统状态。

2.事件触发:定时任务可以在特定的时间间隔内触发事件,如定时发送心跳包以维持长连接状态或定时检查某个条件是否满足并执行相应的操作。

3.性能优化:通过定时任务,可以限制某些操作的频率,避免对系统资源的过度消耗。例如,可以设置一个定时器来限制某个API的调用频率,以避免对后端服务造成过大的压力。

4.定时统计与报告:定时任务可以用于定期收集和分析数据,生成统计报告或图表。例如,可以设置一个定时任务来统计系统的接口访问量、用户活跃度等指标,并将结果发送给相关人员或存储到数据库中。

5.业务逻辑实现:在某些业务场景中,需要使用定时任务来实现特定的业务逻辑。例如,在电商平台上,可以使用定时任务来设置"双十一"零点商品下单接口开通访问权限;在社交应用中,可以使用定时任务来发送生日祝福或提醒用户完成某些任务。

6.自动化运维:定时任务在自动化运维中扮演着重要角色。例如,可以使用定时任务来自动重启服务、更新配置文件、部署新版本等,以减少人工干预并提高运维效率。

总的来说,Go语言中的定时任务具有广泛的应用场景和灵活的使用方法,可以帮助开发人员更好地管理和优化应用程序。通过合理使用定时任务,可以提高系统的稳定性、可用性和可维护性。

下面我们就使用Go语言的一个三方库来实现定时任务:

shell 复制代码
go get github.com/go-co-op/gocron/v2

使用这个库实现定时任务主要分为三步:

  • 创建定时器实例
  • 增加定时任务到定时器中
  • 启动定时器

其实关键就在于定时任务如何定义,下面我们使用两种方式来实现定时任务:

(1)创建定时器

go 复制代码
s, err := gocron.NewScheduler()
if err != nil {
	fmt.Printf("gocron.NewScheduler err : %v", err)
	return
}

(2)创建cron类型的定时任务

这个类型的定时任务使用cron表达式进行任务的处理,比如下面代码的cron表达式* * * * * *​就表示每秒触发一次,后面的参数为bool类型,表示是否精确到秒

go 复制代码
_, err = s.NewJob(gocron.CronJob("* * * * * *", true), gocron.NewTask(
	func() {
		fmt.Printf("CronJob , time : %v \n", time.Now().Format("2006-01-02 15:04:05"))
	},
))
if err != nil {
	fmt.Printf("NewJob err : %v", err)
	return
}

(3)创建DurationJob类型定时任务

这个类型的定时任务是直接使用Go语言的内置类型进行计算,比较简单

go 复制代码
_, err = s.NewJob(gocron.DurationJob(3*time.Second), gocron.NewTask(
	func() {
		fmt.Printf("DurationJob , time : %v \n", time.Now().Format("2006-01-02 15:04:05"))
	},
))
if err != nil {
	fmt.Printf("NewJob err : %v", err)
	return
}

(4)启动定时任务

go 复制代码
s.Start()
select {}

通过控制台我们就可以发现,上面的定时任务是每秒执行一次,下面的定时任务是每三秒执行一次:

shell 复制代码
CronJob , time : 2024-05-19 10:47:03 
CronJob , time : 2024-05-19 10:47:04 
CronJob , time : 2024-05-19 10:47:05 
DurationJob , time : 2024-05-19 10:47:05 
CronJob , time : 2024-05-19 10:47:06 
CronJob , time : 2024-05-19 10:47:07 
CronJob , time : 2024-05-19 10:47:08 
DurationJob , time : 2024-05-19 10:47:08 
CronJob , time : 2024-05-19 10:47:09 

Cgo简单使用

在Go语言中有一句话叫:"Cgo is not Go"。

Cgo​ 是 Go 语言中用于调用 C 语言代码的工具。它允许 Go 程序与 C 语言库进行交互,使得 Go 可以利用 C 语言中丰富的库和代码资源。通过 Cgo​,Go 程序可以调用 C 函数,使用 C 语言定义的数据类型,甚至可以使用 C 语言的头文件和源文件。

下面我们写一个Cgo的Hello World程序:

首先是c语言代码hello.c

c 复制代码
#include <stdio.h>

void sayHello() {
    printf("Hello, World!\n");
}

然后是Go语言代码main.go

go 复制代码
package main

/*
#include "hello.c"
*/
import "C"
import "fmt"

func main() {
	fmt.Println("Calling C function...")
	C.sayHello() // 调用 C 函数
}

最后我们运行go run main.go

shell 复制代码
Calling C function...
Hello, World!

这样就完成了我们的第一个Cgo程序,除此之外Cgo程序还有一些注意事项,比如

  • 确保 C 代码是线程安全的,因为 Go 运行时可能会在不同的线程上并发地调用 C 代码。
  • 避免在 C 代码中使用全局变量,因为这可能会导致数据竞争和其他并发问题。
  • 注意内存管理。Cgo 不会自动为你管理 C 代码分配的内存。如果你从 C 代码分配了内存,你需要在 Go 代码中显式地释放它(使用 C 的 free 函数或其他适当的函数)。同样,如果你在 Go 代码中分配了内存并将其传递给 C 代码,你需要确保 C 代码不会在你不再需要它时释放它。

本节完成~

相关推荐
_一条咸鱼_14 分钟前
Android Runtime直接内存管理原理深度剖析(73)
android·面试·android jetpack
Xi-Xu17 分钟前
隆重介绍 Xget for Chrome:您的终极下载加速器
前端·网络·chrome·经验分享·github
MarkGosling31 分钟前
【开源项目】网络诊断告别命令行!NetSonar:开源多协议网络诊断利器
运维·后端·自动化运维
Codebee34 分钟前
OneCode3.0 VFS分布式文件管理API速查手册
后端·架构·开源
_新一36 分钟前
Go 调度器(二):一个线程的执行流程
后端
estarlee38 分钟前
腾讯云轻量服务器创建镜像免费API接口教程
后端
朱颜辞镜花辞树‎1 小时前
GitHub 操作指南:项目协作与自动化工作流实践
运维·自动化·github
风流 少年1 小时前
Cursor创建Spring Boot项目
java·spring boot·后端
毕设源码_钟学姐2 小时前
计算机毕业设计springboot宿舍管理信息系统 基于Spring Boot的高校宿舍管理平台设计与实现 Spring Boot框架下的宿舍管理系统开发
spring boot·后端·课程设计
音元系统2 小时前
Copilot 在 VS Code 中的免费替代方案
python·github·copilot