探索Go语言中我每个项目必备的5大库

超级欧派课程 2024-03-31 02:52:39

在 Go 语言编程中,其标准库与丰富的第三方库就像是一个宝库,拥有价值连城的资源,可以帮助开发者创建更优秀、更快速的应用程序。

在我的编程经历中,我有幸尝试了一系列的库,并深刻意识到,选择正确的库真的能够改变游戏规则,它们能帮助我消除重复的代码,并提升我服务的整体质量。

以下是我在新项目启动时总是首选的五个Go库,它们成为了我快速构建项目的得力工具。

1. golang-module/carbon

在 Go 中处理时间可能是一项挑战,尤其是当你仅仅依赖于内建的 time.Time 包时,比如:

你如何在 Go 中指定 time.Time​ 值的年份或月份?

过去,当我尝试操纵时间值时,我经常发现自己陷入复杂的代码之中:

t := time.Now() // 获取当前时间// 将年份修改为2020年newTime := time.Date(2020, t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), t.Location())

这正是 Carbon 发挥作用的地方,它提供了一个优雅高效的解决方案,只需一行简短的代码即可实现:

t := carbon.Now().SetYear(2020)

“就这样?”

Carbon 提供了诸多实用的工具,使得在 Go 中处理时间变得更加易于管理,避免了直接处理 time.Time​ 对象的烦恼。

为了让你更好地了解 carbon​ 的实际运用,这里有一些我从他们的 GitHub 文档中摘取的示例,我认为你会发现它们很有帮助:

// 判断是否是当前时间carbon.Now().IsNow() // true// 判断是否是未来时间carbon.Tomorrow().IsFuture() // true// 判断是否是过去时间carbon.Yesterday().IsPast() // true// 判断是否是一月份carbon.Parse("2020-08-05 13:14:15").IsJanuary() // false// 判断是否是星期一carbon.Parse("2020-08-05 13:14:15").IsMonday() // falsecarbon.Parse("2020-08-05 13:14:15").DiffForHumans() // 刚才carbon.Parse("2022-08-05 13:14:15").DiffForHumans() // 两年后2. samber/lo

如果你在 Go 项目中经常处理切片、数组或映射,那么你可能会想看看 Samber/lo 库。

这个库受到 Lodash 的启发,并使用新的 Go 1.18+ 泛型功能构建,提供了诸如过滤、映射、归约、计数和扁平化等一系列有用的工具,以简化复杂的任务,使你的代码更加高效。

例如,你可以使用 Samber/lo 库以 Go 风格重写 Python 的 range​ 函数使用其工具。

result := lo.Range(4)// [0, 1, 2, 3]result := lo.RangeFrom(1, 5)// [1, 2, 3, 4, 5]

像之前的部分一样,我将提供一些从他们的 GitHub 文档中取得的示例,让你更好地了解 samber/lo 能提供什么:

// 寻找唯一值names := lo.Uniq[string]([]string{"Samuel", "John", "Samuel"})// []string{"Samuel", "John"}// 过滤出偶数even := lo.Filter[int]([]int{1, 2, 3, 4}, func(x int, index int) bool { return x%2 == 0})// []int{2, 4}// 反转切片reverseOrder := lo.Reverse[int]([]int{0, 1, 2, 3, 4, 5})// []int{5, 4, 3, 2, 1, 0}

samber/lo 不仅提供了处理切片、数组和映射的有用工具,还包括了一些我经常使用的便捷函数。

举例来说,有一个生成随机字符串的函数,还有一个检查结构是否已初始化的函数:

// ---- RandomStringstr := lo.RandomString(5, lo.LettersCharset)// "eIGbt"// ---- IsNotEmptytype test struct { foobar string}lo.IsNotEmpty[test](test{foobar: ""})// falselo.IsNotEmpty[test](test{foobar: "foobar"})// true3. zerolog

在处理大型项目的日志时,重要的是要结构化我们的日志,以便于阅读、查询和速度。如果你对结构化日志不熟悉,请查看这篇文章:结构化日志是什么,以及它们是如何提升性能的?

“为什么你选择不使用其他的结构化日志库,比如 logrus 或 zap?”

Zerolog 是一个性能出色且非常易于使用的日志库。

如果你对那么多不同的选择感到不知所措,不要浪费时间,随便选一个开始尝试。

除了它令人印象深刻的性能,Zerolog 还提供了一系列有用的工具。

例如,你可以使用 Zerolog 来记录日志事件发生的位置,这样可以轻松地追踪代码中的错误和问题:

log.Logger = log.With().Caller().Logger()log.Info().Msg("hello world")// 输出: {"level": "info", "message": "hello world", // "caller": "/go/src/your_project/some_file:21"}4. jinzhu/copier

说到复制或深度克隆,我脑海中总是会想到 Copier 这个方便的工具。

它在处理复杂数据结构或嵌套结构时特别有用,因为手动复制数据可能是一个繁琐且容易出错的任务。

copier.CopyWithOption(&to, &from, copier.Option{IgnoreEmpty: true, DeepCopy: true})

举个例子,假设我们有两个模型:User 包含了用户的所有信息,而 SimpleUser 则不包括他们的电子邮件和密码:

type User struct { Name string Age int Email string Password string}type SimpleUser struct { Name string Age int}

假设我需要从数据库中检索用户信息,处理它,并返回一个修改过的用户对象,该对象不包含敏感信息,比如电子邮件和密码,以避免任何安全漏洞:

// --- Mockupfunc getUserFromDB() User { return User{ Name: "Aiden", Age: 30, Email: "aidenlee@gmail.com", Password: "thisisasecret"}}// --- func Sample() (s SimpleUser, err error) { user := getUserFromDB() // ... 对用户进行操作后返回 simpleUser err = copier.Copy(&s, &user); return s, err}

对于创建结构的深度复制,copier 是一个非常方便的工具(它可能无法处理未导出的字段):

func Clone[T any](input T) (*T, error) { var output = new(T) err := copier.CopyWithOption(output, input, copier.Option{DeepCopy: true}) return output, err }

Copier 提供了一系列特性:

从同名字段到同名字段复制从同名方法到同名字段复制从同名字段到同名方法复制从切片到切片复制从结构到切片复制从映射到映射复制通过标签强制复制字段通过标签忽略字段深度复制5. stretchr/testify

如果你在使用像 C#、JavaScript with Selenium 或 Playwright 这样的其他语言进行测试时,可能已经熟悉使用断言和期望。不过,直到我发现 testify 包,我才在 Go 中找到了类似的东西。

Testify 的 assert​ 包为我们的测试提供了许多有用的工具,比如:

func TestSomething(t *testing.T) { // 断言相等 assert.Equal(t, 123, 123, "他们应该是相等的") // 断言不相等 assert.NotEqual(t, 123, 456, "他们不应该是相等的") // 断言为 nil(对于错误很好) assert.Nil(t, object) // 断言不为 nil(当你期待某物时很好) if assert.NotNil(t, object) { // 现在我们知道 object 不是 nil,我们可以安心地 // 进行进一步的断言,而不会引起任何错误 assert.Equal(t, "Something", object.Value) }}

在 testify v1 中(在我写这篇文章的时候,Testify 团队正在努力开发 v2),该库提供了几个特性来促进 Go 的测试:

已经提到的 Asserts 包。Mock 包:这提供了一种简单的方式来创建模拟对象,可以在测试期间替换真正的对象。Suite 包:你可以使用一个结构来构建测试套件,定义结构上的设置/拆卸和测试方法,并像通常那样用 go test​ 运行它们。

通过对这些 Go 库的深入讨论,我希望能帮助你认识到它们在日常开发中的实用性。无论你是 Go 的新手还是资深开发者,这些库都值得一试。我推荐你将这些建议融入到你的下一个项目中,它们将会让你的开发工作流变得更加高效且愉快。

掌握Golang精髓,释放编程潜能!关注我的《Golang实用技巧》专栏,它将为你揭秘生产环境最佳实践,带你探索高并发编程的实用教程。从分享实用的Golang小技巧到深入剖析实际应用场景,让你成为真正的Golang大师。无论你是初学者还是经验丰富的开发者,这里都有你所需要的灵感和知识。让我们一同探索Golang的无限可能!

0 阅读:0

超级欧派课程

简介:感谢大家的关注