linbuxiao / gitblog

1 stars 0 forks source link

Stringer Generator #9

Open linbuxiao opened 2 years ago

linbuxiao commented 2 years ago

Stringer 提供了一种能力:生成常数枚举类型的 String方法。

首先,Stringer 会导入包。例如包内具有如下类型:

type Pill int
const (
  a Pill = iota
  b
  c
)

此时 Pill 为常数枚举类型,abc 分别为 Pill 的 Runs。

解析

使用标准库 packages 与 ast 提供的能力,可以解析出包内 Type 与 Runs 的信息。

生成

这一步在 g.Parse 中进行,接着调用 g.generate 方法进行生成, 生成的步骤也较为简单:

  1. g.Printf 方法提供向 g.buf 写入的途径,任何向输出文件写入的内容都可以直接通过这个方法写入 buf。
  2. 输出的内容类似于:
    func (i Day) String() string {
    if i < 0 || i >= Day(len(_Day_index)-1) {
        return "Day(" + strconv.FormatInt(int64(i), 10) + ")"
    }
    return _Day_name[_Day_index[i]:_Day_index[i+1]]
    }

    当 i 在于当前已有枚举范围时,将从一个 map 中去截取枚举名:

    const _Day_name = "MondayTuesdayWednesdayThursdayFridaySaturdaySunday"

    不在则返回 类型名 + 枚举。

输出

使用 g.format() 方法将 buf 进行输出。