/images/hugo/avatar.png

Go generate

1. go generate

1.1 简介

项目构建,通常我们会依赖一些构建管理工具,比如shell脚本、make等。通过 make 我们可以在编译和构建 Go 代码之前,完成诸如 protobuf 文件生成等等编译代码所需要的前置动作。不过,Go 1.4 版本的Go工具链中增加了在构建之前驱动执行前置动作的能力,这就是go generate命令。我们看下面这个示例:

Go 常用工具

go 原生提供的工具,在 gopath 和 module-ware 两种模式上存在一些行为差异。接下来我们会分别介绍 go 原生工具在这两种模式下的使用。

1. go get

go get 用于获取 Go 包及其依赖包

常用命令如下:

Go reflect

1. 反射

Go在标准库中提供的reflect包让Go程序具备运行时的反射能力(reflection,又称为自省)。反射是程序在运行时访问、检测和修改它本身状态或行为的一种能力,各种编程语言所实现的反射机制各有不同。Go语言的interface{}类型变量具有析出任意类型变量的类型信息(type)和值信息(value)的能力,Go的反射本质上就是利用interface{}的这种能力在运行时对任意变量的类型和值信息进行检视甚至是对值进行修改的机制。

Go unsafe包的安全使用模式

1. 类型安全

在Go语言中,我们是无法通过常规语法手段穿透Go在类型系统层面对内存数据的保护的:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
func main() {
    a := 0x12345678
    fmt.Printf("0x%x\n", a)

    var p *byte = (*byte)(&a)   // 错误!不允许将&a从*int类型显式转型为*byte类型
    *p = 0x23

    var b byte = byte(a)        // b是一个新变量,有自己所解释的内存空间
    b = 0x23                    // 即便强制进行类型转换,原变量a所解释的内存空间的数据依然不变
    fmt.Printf("0x%x\n", b)     // 0x23
    fmt.Printf("0x%x\n", a)     // 0x12345678
}

Go在常规操作下是类型安全的(注:并非绝对的类型安全,绝对的类型安全需要在数学上的形式化证明)。所谓类型安全是指一块内存数据一旦被特定的类型所解释(该内存数据与该类型变量建立关联,也就是变量定义),它就不能再被解释为其他类型,不能再与其他类型变量建立关联。