简介 前一篇文章介绍了 Go 标准库中的日志库 log。最后我们也提到,log库只提供了三组接口,功能过于简单了。 今天,我们来介绍一个日志库中的“明星库”——logrus。 logrus完全兼容标准的log库,还支持文本、JSON 两种日志输出格式。很多知名的开源项目都使用了这个库,如大名鼎鼎的 docker。 msg" func=main.main file="D:/code/golang/src/github.com/go-quiz/go-daily-lib/logrus/caller/main.go:10 logrus.SetOutput(io.MultiWriter(writer1, writer2, writer3)) logrus.Info("info msg") } 自定义 实际上,考虑到易用性,库一般会使用默认值创建一个对象 我们之前好几篇文章都提到过这点: Go 每日一库之 flag:flag标准库中的CommandLine对象; Go 每日一库之 log:log标准库中的std对象。
minutes ++ ; } } System.out.println(minutes); } } 解析: 你有可能一下子就说出了 60 因为能整除 60 * 1000 的只能是 1 * 60 * 1000 ,2 * 60 * 1000 ….一直到 60 * 60 * 1000 一共60 个 但答案让你失望了,是60000 其实 ,这个的陷阱是在ms % 60*1000 == 0的操作符的优先级上 % 和 * 是同一级的 所以它是(ms % 60) * 1000 == 0 这样满足ms % 60就多了 每日一题 public
RabbitMQ简介 RabbitMQ 是一个广泛使用的开源消息队列系统,它实现了高级消息队列协议(AMQP)标准,为分布式应用程序提供了强大的消息传递功能。 工作流程 RabbitMQ 的工作流程如下: •生产者将消息发布到一个或多个交换机。•交换机根据绑定规则将消息路由到一个或多个队列。•消费者订阅队列并接收消息。 安装 RabbitMQ 客户端库 首先,您需要使用 Go 的包管理工具安装 github.com/rabbitmq/amqp091-go 包,可以使用以下命令: go get github.com/rabbitmq 打开通道 在连接上打开一个通道(channel),用于进行消息传递操作。通道是轻量级的通信路径,允许您在单个连接上创建多个通道。 定义队列 在发送和接收消息之前,您需要定义一个队列。如果队列不存在,它将被创建。
google.golang.org/protobuf/encoding/protojson 是 Go 语言中的一个库,用于处理 Protocol Buffers(protobuf)和 JSON 之间的转换 以下是该库的一些主要功能: •将 protobuf 消息转换为 JSON 格式:这是通过 Marshal 或 MarshalOptions.Marshal 函数实现的。 这些函数接收一个 protobuf 消息并返回一个 JSON 格式的字符串。 这些函数接收一个 JSON 格式的字符串和一个 protobuf 消息的指针,然后将 JSON 数据解析并填充到 protobuf 消息中。 •支持 Well-Known Types:该库提供了对 protobuf 的 Well-Known Types 的特殊处理,例如 Timestamp、Duration、Struct、Value 等。
sonic是一个由字节跳动开发并开源的 JSON 解析库,由 JIT (即时编译)和 SIMD (单指令流多数据流)来加速序列化/反序列化。 在细节上,进行了一些进一步的优化: 1.由于 Golang 中的原生汇编函数不能被内联,其成本甚至超过了 C 编译器的优化所带来的改善。 所以在 JIT 中重新实现了一组轻量级的函数调用:•全局函数表+静态偏移量,用于调用指令•使用寄存器传递参数2.Sync.Map 一开始被用来缓存编解码器,但是对于准静态(读远多于写),元素较少(通常不足几十个 )的场景,它的性能并不理想,所以使用开放寻址哈希和 RCU 技术重新实现了一个高性能且并发安全的缓存。 字符串,然后使用sonic.Unmarshal函数将其解析为一个map[string]interface{}类型的变量。
sqlx 是一个用于增强 Go 语言标准库中 database/sql 包的第三方库,它提供了一些额外的功能和工具,使得与数据库交互更加方便和灵活。 连接数据库 在使用 sqlx 之前,你需要先通过 database/sql 包来连接到数据库。然后,你可以使用 sqlx.Open 函数来打开一个数据库连接,并将连接传递给 sqlx.DB 对象。 你可以使用 db.Query 或 db.Queryx 方法来执行查询操作,返回一个 *sql.Rows 或 *sqlx.Rows 对象。 你可以使用 db.Exec 方法来执行这些操作,它返回一个 sql.Result 对象。 它提供了一些方便的方法来处理查询结果、参数绑定以及基本的数据库操作,使得与数据库交互更加高效和可维护。
Memcache 是一个高性能、分布式的内存缓存系统,常用于缓存数据库查询结果、API调用结果、页面内容等,以提升应用程序的性能和响应速度。 8.网络协议: Memcache 使用基于文本的协议进行通信,可以通过 Telnet 或客户端库与 Memcache 进行交互。 10.持久化支持: Memcache 不支持数据的持久化存储,数据只存储在内存中,不会写入磁盘。如果需要数据持久化,需要额外的处理。 使用 Memcache 通常需要将数据从数据库或其他数据源读取到缓存中,然后在应用程序中读取缓存数据,从而提升读取性能。 , Expiration: 10, // 缓存有效时间,单位为秒 } // 将缓存项存入 Memcache if err := mc.Set(item); err
gosec 是一个用于在 Go 代码中查找安全问题的开源工具,它可以帮助发现可能的漏洞和潜在的安全风险。以下是关于 gosec 的详细介绍: 1. 使用示例 以下是一个使用 gosec 的简单示例: gosec ./... 此命令将在当前目录及其子目录中扫描 Go 代码,并报告发现的任何安全问题。 5. 输出示例 以下是 gosec 的输出示例: [gosec] 2023/05/10 Found 2 issues (2 low, 0 medium, 0 high, 0 critical) in the 以下是一些常见的配置选项: 7.1 配置文件 gosec 支持 YAML 和 JSON 格式的配置文件。 可以创建一个名为 .gosec.yaml 或 .gosec.json 的配置文件,并在其中指定要使用的规则、排除的文件、自定义规则等。
访问嵌入文件: 使用 embed 包嵌入的文件是一个 string 、 []byte 或 embed.FS 类型的变量,你可以直接在代码中访问它们。在运行时,这些变量会被初始化为嵌入文件的内容。 同时,它只能嵌入在 Go 源代码文件同一目录或子目录下的文件或目录。 总之,go embed 是一个强大的特性,使得在 Go 代码中嵌入文件变得更加方便和简单,特别是在需要将静态资源或配置文件包含在应用程序中时。
xorm 是一个功能强大的 Go 语言 ORM(对象关系映射)库,提供了许多特点和功能,使得与关系型数据库的交互更加便捷、高效。 以下是 xorm 的一些主要特点: 1.简化数据库操作: xorm 封装了数据库操作,使得 CRUD(增删改查)等常见操作更加简单,开发者可以专注于业务逻辑而不必过多关注底层的数据库操作。 5.事务支持: xorm 支持事务操作,通过 NewSession 方法来创建会话,可以使用事务来确保一组操作的原子性和一致性。 9.多数据库支持: 可以同时连接多个不同类型的数据库,进行跨数据库操作。10.高级特性: 支持数据库连接池、数据库引擎的选择、连接保活等高级特性。 然后,你可以使用 xorm.NewEngine 函数来创建一个 xorm.Engine 对象,用于执行数据库操作。
JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为 JSON 对象。 以下是 JWT 的一些主要特性: 1.紧凑(Compact):由于其小的尺寸,JWT 可以通过 URL、POST 参数或者在 HTTP header 中发送,这使得 JWT 非常适合用于通过 HTTP/ 2.自包含(Self-contained):JWT 的载荷中包含了所有用户需要的信息,避免了多次查询数据库。 以下是使用 github.com/golang-jwt/jwt 库创建和解码 JWT 的 Go 语言示例: 首先,你需要安装 golang-jwt/jwt 库,可以通过以下命令进行安装: go get JWT,并指定了签名方法和声明;然后,使用一个密钥签名并获取完整编码的 token;最后,我们解析 token,并验证签名方法和声明。
标准库 cmp 原文在这里[1] go 1.21 新增 cmp 包提供了与有序变脸比较相关的类型和函数。 | ~uint16 | ~uint32 | ~uint64 | ~uintptr | ~float32 | ~float64 | ~string } Ordered 是一个约束 请参阅 Compare 函数,以获取一种一致的方式来比较 NaN 值。 github.com/google/go-cmp/cmp github.com/google/go-cmp/cmp 是一个 Go 语言中用于比较任意两个值是否相等的库。 以下是一些示例: 使用自定义比较选项 opts := cmp.Options{ cmp.IgnoreFields(Person{}, "Age"), // 忽略 Person 结构体的 Age
它是一个非常强大和灵活的工具,用于监控应用程序和系统的性能,并根据预定义的规则触发警报。 每个时间序列都由一组键值对唯一标识,这使得数据非常灵活且容易查询。 4.持久性存储: Prometheus 使用本地存储引擎来保存时间序列数据,这使得它能够高效地存储大量数据,并且不需要依赖外部数据库。它还支持数据快照和备份。 3.Client Libraries: Prometheus 提供各种语言的客户端库,允许应用程序开发者轻松将度量数据暴露给 Prometheus。这些库可用于记录自定义应用程序指标。 步骤2:引入 Prometheus Go 客户端库 Prometheus 提供了一个用于 Go 应用程序的客户端库,你需要引入这个库以便在应用程序中生成度量数据。
github.com/spf13/cobra 是一个用于构建强大的命令行应用程序的 Go 语言库。 以下是 cobra 库的主要特性和用法示例: 主要特性 1.子命令支持:cobra 允许您创建包含多个子命令的命令行工具。这使得您可以组织和管理大型 CLI 应用程序。 6.内置的有效命令行解析:cobra 使用标准库的 flag 包进行命令行解析,同时提供更高级的功能。 用法示例 以下是一个简单的示例,演示了如何使用 cobra 创建一个简单的命令行工具: package main import ( "fmt" "github.com/spf13/cobra 这只是一个简单的示例,cobra 可以轻松处理更复杂的命令行接口,包括添加标志、参数、子命令和自定义用法信息。
Gin是一个用Go语言编写的Web框架,它旨在提供高性能、轻量级的解决方案。 可以使用Go语言的包管理工具go get来安装: go get -u github.com/gin-gonic/gin 示例代码 以下是一个简单的Gin框架示例代码: package main import "github.com/gin-gonic/gin" func main() { // 创建一个Gin实例 r := gin.Default() // 定义路由处理函数 , }) }) // 启动HTTP服务 r.Run(":8080") } 在这个示例中,我们创建了一个简单的Gin实例,定义了一个GET路由"/hello",当请求该路由时 ,返回一个JSON格式的响应。
go本身的包os/exec包含了对应的实现,接下来我们举个例子说明一下 执行 go version 打印go版本 package main import ( "fmt" "log" 例如设置工作目录,设置执行超时等特殊需求,这个时候原生库的编码就会让人很难受。 今天在这里推荐一个可以在linux/windows/darwin 上执行命令的golang开源库,这个库的Star虽然不是很高,但是封装后的api使用起来还算舒服。 还是通过几个例子来进行一下说明 shell脚本 输入文本 package main import ( "fmt" "github.com/commander-cli/cmd" ,大家一起学习进步。
github.com/spf13/cast 和 strconv 都是 Go 语言中用于类型转换的工具库,但它们在功能和使用方式上有一些不同。 github.com/spf13/cast github.com/spf13/cast 是一个开源的 Go 类型转换库,由 Hugo 项目的创始人 Steve Francia 开发。 它的目标是提供一种更简单、更灵活的类型转换方式,以处理常见的类型转换场景,如将 interface{} 转换为基本类型、字符串转换为数字等。 // 自定义类型转换函数 cast.RegisterConverter(myType{}, customConverter) } strconv strconv 是 Go 语言标准库中的一个模块 •strconv 是 Go 标准库的一部分,无需引入外部依赖,但对于复杂类型的转换不支持。 在选择使用哪个工具库时,需要根据具体的场景和需求来决定。
GORM(Go Object-Relational Mapping)是一个用于Go语言的ORM库,它提供了一种简单、优雅的方式来操作数据库。 6.预加载:GORM支持预加载,这意味着你可以一次性查询出关联的数据,而不需要多次查询。7.事务:GORM支持数据库事务,你可以很容易地开始、提交或回滚一个事务。 8.日志:GORM提供了详细的日志,你可以看到每一次的数据库操作。9.扩展性:GORM提供了许多接口,你可以通过实现这些接口来扩展GORM的功能。 10.测试:GORM提供了方便的测试工具,你可以很容易地为你的代码编写测试。 以下是一些基本的GORM操作: 1. 以下是一个连接到MySQL数据库的示例: package main import ( "gorm.io/driver/mysql" "gorm.io/gorm" ) func main
ent 是一个由 Facebook 开发的 Go 语言的实体框架,用于构建和维护数据模型。它提供了一种简单的方式来定义、交互和查询数据。 以下是 ent 的一些主要特性和使用方法: Schema 定义 在 ent 中,你可以使用 Go 代码来定义你的数据模型(实体)。每个实体都有一个 schema 文件,定义了实体的字段和关系。 ent.Field { return []ent.Field{ field.String("name"), field.Int("age"), } } 生成代码 一旦你定义了 你可以使用 ent migrate 命令来创建和更新数据库表。 以上就是 ent 的基本使用方法。
在Go语言中,我们可以使用第三方库github.com/google/uuid来方便地生成UUID。本文将介绍如何使用这个库来生成不同版本的UUID,以及它的优势和用途。 安装github.com/google/uuid首先,我们需要在项目中引入github.com/google/uuid库。 数据库主键:UUID可以作为数据库表的主键,避免主键冲突。 安全性:版本4的UUID是完全随机生成的,可以用于密码重置、令牌等场景,提高安全性。 总结: github.com/google/uuid库为Go语言开发者提供了一种便捷的方式来生成不同版本的UUID。 通过这个库,你可以轻松地生成全球唯一的标识符,并在分布式系统和安全性要求较高的场景中发挥重要作用。