标签「go」下的文章

bjmayor发布于2021-08-29

go 命令行参数解析

[TOC]

go标准库-flag

命令行的风格

由于一些历史原因,Unix 出现过很多不同的分支,命令行的风格也因此有很多标准,比如:

  • Unix 风格,选项采用单 - 加一个字母,比如 -v,短选项就是它,优点是足够简洁;
  • BSD 风格,选项没有 -,没有任何的前缀;
  • GNU 风格,采用 --,如 --version,长选项,扩展性好,但是要多打几个字母;

查看系统进程有两种写法:
ps aux(BSD 风格) 和 ps -elf(Unix 风格)。

POSIX 的命令行风格算是取长补短的集合吧。什么是 POSIX 风格?可以查看这篇文档命令参数语法。它同时提供了长短选项的标准。

阅读全文»

bjmayor发布于2021-08-29

go-正则

[TOC]

go标准库-regex

表达式对象

//初始化结构体对象的方法 func Compile(expr string) (*Regexp, error) //和Compile函数相似,但是该方法支持POSIX协议,可以支持类似`egrep`的语法 func CompilePOSIX(expr string) (*Regexp, error) //Must系列函数和上面两个函数相似,但是不会返回error,如果有异常直接panic func MustCompile(str string) *Regexp func MustCompilePOSIX(str string) *Regexp

阅读全文»

bjmayor发布于2021-08-29

go 工具介绍

[TOC]

go的工具比较丰富,为了保证代码的高质量可以多用下。

example

主要用于导入导GoDoc等工具生成的帮助文档中。它通过比较输出(stdout)和内部的(output)注释是否一致来判断是否成功。

func ExampleAdd() { fmt.Pringln(add(1,2)) // Output: // 3 }

如果没有output注释,该示例函数就不会被执行。另外,不能使用内置函数print/println,因为他们输出到stderr

阅读全文»

bjmayor发布于2021-08-29

go-time包

[TOC]

Go 的时间操作基本上都用 time 包。

*time.Location 类型

在 Go 中,表示时区的类型是 type Location struct{...} ,代码中使用 *time.Location 对象。
对于不严格的场景而言,可以获取服务器所处的时区。但是本文不建议这个方法。因为一台服务器服务的时区是事先可知的,或者说是需要对接的时区信息也是已知的(比如对接微信,那么时间肯定是东八区,而不是 UTC 时间)。获得东八区时区的代码如下:

loc, _ := time.LoadLocation("Asia/Shanghai")

之后这个 loc 可以作为常量使用。是否能够拿到时区,取决于机器本地的 zoneinfo 文件。后文也将使用这个 loc 作为全局变量。在docker环境下,没有zoneinfo文件,所以需要自定义一个时区名称,比如我们人工添加一个巴西利亚时间:

brazil := time.FixedZone("Brazil/Brasilia", -3*60*60)

这里我们同时要知道一个很重要的概念,就是在 *Location 的加持下,一个 Time 类型本身是同时记录着 UTC 时间和本地时间的,这就使得一个 Go 时间类型不会因为时区而出现歧义,比如你可以用一个东八区的 Time 和西八区的 Time 随意进行运算也不会出错。这一特性使得时间类型变得极为实用。

阅读全文»

bjmayor发布于2021-08-29

go信号处理示例

[TOC]

golang信号signal的处理

在实际项目中我们修改了配置文件后,希望在不重启进程的情况下重新加载配置文件,这时候就需要通过信号传递来进行处理了。golang中对信号的处理主要使用os/signal包中的两个方法:

一个是notify方法用来监听收到的信号;

一个是 stop方法用来取消监听。下面给一个些示例。

阅读全文»