Go第三方库samber/lo - 一个类似 Lodash 的 Go 库,简化开发、提高效率

介绍

在 Go 语言的开发过程中,我们经常需要使用一些常用的工具函数来简化代码编写和提高开发效率。 samber/lo 是一个类似于 JavaScript 中的 Lodash 库的 Go 语言库, 它提供了许多实用的函数和工具,帮助开发人员更轻松地处理各种常见任务。 本篇博文将简单介绍 samber/lo 库的特性和使用方法。

特性

samber/lo 库是基于Go 1.18+泛型的、Lodash风格的Go语言库。

包含了非常多的方法,使得它成为一个强大且实用的工具库:

  1. slice 辅助方法
  2. map 辅助方法
  3. math 辅助方法
  4. strings 辅助方法
  5. tuples 辅助方法
  6. channels 辅助方法
  7. intersection 辅助方法
  8. search 辅助方法
  9. conditional 辅助方法
  10. concurrency 等辅助方法

Docker - 清理Docker占用的磁盘空间

前言

今天突然收到测试服务器的磁盘空间不足的报警,处理这种报警还是比较有经验的,肯定是docker的日志占用了太多的磁盘空间导致, 之前处理后,比较懒,没有记录下来。

根据以往的处理经验,这种情况就很好解决,找到日志比较大的容器,删除日志,并调整日志级别即可解决。

我兼职打杂运维工作,我们团队所有组件都在云上飘着, 有很多的微服务组件,就需要使用服务发现,链路跟踪等配套设施,也少不了使用docker

最近为了能够方便的扩容,我们决定使用HashiCorp家的轻量级的服务编排,安装了他家的几个docker服务,并把服务发现替换成了consul。 运行了几天后,出现磁盘空间不足的报警。

当你使用docker,并且容器运行比较久,程序又疯狂的输入后,就会导致docker的日志占用磁盘空间太大,这时候就需要清理一下了。

根据以住的解决问题的思路,这次记录下来,方便以后查阅,也给其遇到此问题的小伙伴一个参考。

Rust 入坑之前言 - 进入Rust的编程世界

前言

由于个人原因,主要是为了缓解焦虑,其次掌握一门新的编程语言,扩展视野等,希望未来能有用武之地,所以决定学习一门新的编程语言,这门编程语言就是Rust。

为什么是Rust

Rust是由Mozilla员工“Graydon Hoare”于2006年开发的系统编程语言。他将这种语言描述为支持功能和命令范式的“安全,并发和实用的语言”。 Rust 集表达力、高性能、内存安全于一身,在 1.0 版本发布后不久,口碑就一路高飞猛进,从 16 年起,连续 6 年成为 Stack Overflow 用户评选出来的最受喜爱的语言(2021/3/15 评选结果)。

  1. 性能

    Rust非常快速且内存高效:没有运行时或垃圾收集器,它可以为性能关键型服务提供动力,在嵌入式设备上运行,并且很容易与其他语言集成。

  2. 可靠

    Rust 丰富的类型系统和所有权模型保证了内存安全和线程安全——使您能够在编译时消除许多类别的错误。

  3. 生产率

    Rust 拥有出色的文档、带有有用错误消息的友好编译器以及一流的工具——集成的包管理器和构建工具、具有自动完成和类型检查功能的智能多编辑器支持、自动格式化程序等等

  4. 强大且活跃的社区

  5. 被广泛使用, Google, Microsoft, Firefox, Dropbox, Linux内核等等,都在生产环境上使用了Rust

Go语言的array、slice,你需要知道的那些事儿

Go语言中的arrayslice,你真的了解了吗?先看下段代码,如果你心中的结果都答对了,并且能说出具体原因(不是蒙对的:)),那么你就可以不用在这里浪费时间了. 这段代码也让我反思自己,文档认真看了吗?看过文档后记住了吗?(不是过个几天就忘了)反复看过文档吗?我回答自己:认真看了,当时记住了,没有反复看过,来增强记忆。从现起改正自己吧。

不啰嗦了,直接上代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
//省略package 和 import
func slice() []int {
    s1 := []int{1, 2, 3, 4}
    s2 := []int{-1, -2, -3}
    return append(append(s1[:1], s2...), s1[1:]...)
}

func slice1() []int {
    s1 := []int{1, 2, 3, 4}
    s2 := []int{-1, -2, -3, -4}
    return append(append(s1[:1], s2...), s1[1:]...)
}

func main() {
    // output?
    fmt.Printf("func slice=%+v\n", slice())
    fmt.Printf("func slice1=%+v\n", slice1())
}

下边的内容,可能会对你有一些帮助。 先来回顾一下Go语言的array

Go语言的defer那点事

Go语言的defer语句提供了强大的机制,通常用于简化执行各种清理操作,释放锁等操作,例如能够保证打开的文件,肯定被关闭,那你真的理解defer了吗?

我们先看下边一段代码。先自己在心里运行一遍结果,然后在去验证。如果都对了,恭喜你不用看了,该干嘛干嘛去吧,不要浪费时间。

我的Git提交信息规范

Git 每次提交代码,都要写 commit message(提交说明,写啥都可以),否则就不允许提交。 但是对commit message的提交信息格式一直是个头疼的问题。在协作人数比较少的情况尊守口头规范还可以,在协作人数比较多的情况,如果没有规范,就是个头疼的问题,比如在作code review时,没办法很快的找到相关的commit.

最近看了一些关提交规范的文章,特别是阮一峰老师的Commit message 和 Change log 编写指南文章,才有了更清晰的认识。commit message 应该清晰明了,说明本次提交的目的。

格式化的提交信息有诸多好处,整理一套自己用的提交信息格式,并在团队中试运行一段时间,感觉还不错,这是有这篇文章的原因。

Golang的包管理实践

Golang包管理带来的问题

Golang包管理,在团队成员比较少的情况下,Golang自带的包管理工具 go get 足已满足使用,但是由于服务端团队在急速扩张,同学越来越多,对于Golang包管理就会带来以下问题:

  1. 所有项目共同使用GOPATH中的第三方库, 缺乏明确显示的版本。团队开发容易导入不一样的版本。
  2. 第三方包没有内容安全审计,很容易引入代码 Bug
  3. 每位同学都需要 go get 所有包。
  4. 如果换台电脑,又需要重新go get下载。

解决办法就是使用包管理工具,让项目引用的第三方库,列入到项目里面,进行版本管理,即可解决。