/images/hugo/avatar.png

go time

1. 时间基础操作

1.1 时间的表示

获取当前时间可以使用 time.Now(),Now 返回的是 Time 结构的结构,Time 是对即时时间的抽象。time.Time的结构如下:

go 的文件 IO

这个系列我们开始学习 Go 语言的第五个部分: 库。 接下来我们就从 Go 的文件 I/O 说起。

1. 文件 IO 概述

1.1 标准库的读写模型

Go基于io.Writer和io.Reader这两个简单的接口类型构建了图57-1所示的Go标准库读写模型。

go 信号处理

在Go中,通过系统信号是实现优雅退出的一种常见手段。

1. 信号处理

应用程序收到系统信号后,一般有三种处理方式。

  1. 执行系统默认处理动作,对于中断键触发的SIGINT信号,系统的默认处理动作是终止该应用进程
  2. 忽略信号
  3. 捕捉信号并执行自定义处理动作,需要应用程序提前为信号注册一个自定义处理动作的函数。系统中有两个系统信号是不能被捕捉的:终止程序信号SIGKILL和挂起程序信号SIGSTOP

服务端程序一般都是以守护进程的形式运行在后台的,并且我们一般都是通过系统信号通知这些守护程序执行退出操作的。如果执行默认处理动作直接退出,守护进程将没有任何机会执行清理和收尾工作。因此,对于运行在生产环境下的程序,不能忽略对系统信号的处理,而应采用捕捉退出信号的方式执行自定义的收尾处理函数。

go 字符集编码/解码

1. 字符集原理

Go语言默认源码文件中的字符是采用UTF-8编码方案的Unicode字符。在Go中,每个rune对应一个Unicode字符的码点,而Unicode字符在内存中的编码表示则放在[]byte类型中。从rune类型转换为[]byte类型,称为“编码”(encode),而反过来则称为“解码”(decode)。

go hacker 编程

每个语言都有一些 hacker 编程,这些 hacker 编程在某些时候能起到奇效,但是不能被乱用。

1. 获取 goroutine id

获取 goroutine id,方式有两种,分别是

  1. 简单方式:通过 runtime.Stack 方法获取栈帧信息,栈帧信息里包含 goroutine id
  2. hacker 方式:
    • 原理: 我们获取运行时的 g 指针,反解出对应的 g 的结构。每个运行的 goroutine 结构的 g 指针保存在当前 goroutine 的一个叫做 TLS 对象中
    • 第一步:我们先获取到 TLS 对象
    • 第二步:再从 TLS 中获取 goroutine 结构的 g 指针
    • 第三步:再从 g 指针中取出 goroutine id。
    • 需要注意的是,不同 Go 版本的 goroutine 的结构可能不同,所以需要根据 Go 的不同版本进行调整。没必要重复造轮子,直接使用第三方库就可以: petermattis/goid

1.1 普通方式

runtime.Stack 方法可以获取当前的 goroutine 信息,第二个参数为 true 会输出所有的 goroutine 信息,信息的格式如下:

go 包和管理工具

go 程序包组织结构和程序管理工具箱

1. 包简介

包和模块的概念几乎存在于所有的编程语言之中,它的存在是为了简化大型程序的设计和维护工作。通过将一组相关的特性放进一个独立的单元以便于理解和更新,这种特性提供诸多益处: