Go小技巧易错点100例(十七)

2024-08-22 01:04
文章标签 go 技巧 100 易错 十七

本文主要是介绍Go小技巧易错点100例(十七),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Go定时任务

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

  1. 任务调度:定时任务可以在特定的时间点执行特定的任务,如定时清理临时文件、定时备份数据等。这对于维护系统状态和数据安全至关重要。定时任务还可以按照固定的时间间隔重复执行某个任务,例如每隔一段时间更新缓存数据或检查系统状态。
  2. 事件触发:定时任务可以在特定的时间间隔内触发事件,如定时发送心跳包以维持长连接状态或定时检查某个条件是否满足并执行相应的操作。
  3. 性能优化:通过定时任务,可以限制某些操作的频率,避免对系统资源的过度消耗。例如,可以设置一个定时器来限制某个API的调用频率,以避免对后端服务造成过大的压力。
  4. 定时统计与报告:定时任务可以用于定期收集和分析数据,生成统计报告或图表。例如,可以设置一个定时任务来统计系统的接口访问量、用户活跃度等指标,并将结果发送给相关人员或存储到数据库中。
  5. 业务逻辑实现:在某些业务场景中,需要使用定时任务来实现特定的业务逻辑。例如,在电商平台上,可以使用定时任务来设置“双十一”零点商品下单接口开通访问权限;在社交应用中,可以使用定时任务来发送生日祝福或提醒用户完成某些任务。
  6. 自动化运维:定时任务在自动化运维中扮演着重要角色。例如,可以使用定时任务来自动重启服务、更新配置文件、部署新版本等,以减少人工干预并提高运维效率。

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

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

go get github.com/go-co-op/gocron/v2

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

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

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

(1)创建定时器

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

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

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

_, 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语言的内置类型进行计算,比较简单

_, 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)启动定时任务

s.Start()
select {}

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

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

#include <stdio.h>void sayHello() {printf("Hello, World!\n");
}

然后是Go语言代码main.go

package main/*
#include "hello.c"
*/
import "C"
import "fmt"func main() {fmt.Println("Calling C function...")C.sayHello() // 调用 C 函数
}

最后我们运行go run main.go

Calling C function...
Hello, World!

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

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

本节完成~

这篇关于Go小技巧易错点100例(十七)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1094796

相关文章

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

Go之errors.New和fmt.Errorf 的区别小结

《Go之errors.New和fmt.Errorf的区别小结》本文主要介绍了Go之errors.New和fmt.Errorf的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考... 目录error的基本用法1. 获取错误信息2. 在条件判断中使用基本区别1.函数签名2.使用场景详细对

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Python进阶之列表推导式的10个核心技巧

《Python进阶之列表推导式的10个核心技巧》在Python编程中,列表推导式(ListComprehension)是提升代码效率的瑞士军刀,本文将通过真实场景案例,揭示列表推导式的进阶用法,希望对... 目录一、基础语法重构:理解推导式的底层逻辑二、嵌套循环:破解多维数据处理难题三、条件表达式:实现分支

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Go中select多路复用的实现示例

《Go中select多路复用的实现示例》Go的select用于多通道通信,实现多路复用,支持随机选择、超时控制及非阻塞操作,建议合理使用以避免协程泄漏和死循环,感兴趣的可以了解一下... 目录一、什么是select基本语法:二、select 使用示例示例1:监听多个通道输入三、select的特性四、使用se