Golang-代码生成

元编程是一种计算程序可以将代码看待成数据的能力。

如果能够将代码看作数据,那么代码就可以像数据一样在运行时被修改、更新和替换;元编程赋予了编程语言更大的表达能力,能够让我们将一些计算过程从运行时挪到编译时、通过编译期间的展开生成代码或者允许程序在运行时改变自身行为的能力。

总而言之,元编程其实是一种使用代码生成代码的方式,无论是编译期间生成的代码,还是运行时改变代码的行为都是生成代码的一种。

例子

代码main.go 里含有//go:generate stringer -type=Pill

package main

import "fmt"

//go:generate stringer -type=Pill
type Pill int

const (
    Placebo Pill = iota
    Aspirin
    Ibuprofen
    Paracetamol
    Acetaminophen = Paracetamol
)

func main() {
    fmt.Println(Placebo.String(), Acetaminophen.String())
}

生成 代码 go generate 会生成 pill_string.go 如下

// Code generated by "stringer -type=Pill"; DO NOT EDIT.

package main

import "strconv"

func _() {
    // An "invalid array index" compiler error signifies that the constant values have changed.
    // Re-run the stringer command to generate them again.
    var x [1]struct{}
    _ = x[Placebo-0]
    _ = x[Aspirin-1]
    _ = x[Ibuprofen-2]
    _ = x[Paracetamol-3]
}

const _Pill_name = "PlaceboAspirinIbuprofenParacetamol"

var _Pill_index = [...]uint8{0, 7, 14, 23, 34}

func (i Pill) String() string {
    if i < 0 || i >= Pill(len(_Pill_index)-1) {
        return "Pill(" + strconv.FormatInt(int64(i), 10) + ")"
    }
    return _Pill_name[_Pill_index[i]:_Pill_index[i+1]]
}

Last updated

Was this helpful?