golang通过代码注释自动生成枚举编码插件库go-enum-encoding的使用

golang通过代码注释自动生成枚举编码插件库go-enum-encoding的使用

go-enum-encoding 是一个简单高效的 Go 语言枚举编码生成工具,它可以通过代码注释自动生成枚举的编码/解码方法、测试和基准测试代码。

安装

go install github.com/nikolaydubina/go-enum-encoding@latest

特性

  • 仅200行代码
  • 简单、快速、严格
  • 自动生成编码/解码方法、测试和基准测试

使用示例

结构体类型枚举

type Color struct{ c uint8 }

//go:generate go-enum-encoding -type=Color
var (
    UndefinedColor = Color{}  // json:""
    Red            = Color{1} // json:"red"
    Green          = Color{2} // json:"green"
    Blue           = Color{3} // json:"blue"
)

iota 常量枚举

type Size uint8

//go:generate go-enum-encoding -type=Size
const (
    UndefinedSize Size = iota // json:""
    Small                     // json:"small"
    Large                     // json:"large"
    XLarge                    // json:"xlarge"
)

生成代码

运行以下命令生成代码:

go generate

性能基准测试

生成的基准测试结果示例:

$ go test -bench=. -benchmem .
goos: darwin
goarch: arm64
pkg: github.com/nikolaydubina/go-enum-encoding/internal/testdata
cpu: Apple M3 Max
BenchmarkColor_UnmarshalText-16         752573839                1.374 ns/op           0 B/op          0 allocs/op
BenchmarkColor_AppendText-16            450123993                2.676 ns/op           0 B/op          0 allocs/op
BenchmarkColor_MarshalText-16           80059376                13.68 ns/op            8 B/op          1 allocs/op
BenchmarkImageSize_UnmarshalText-16     751743885                1.601 ns/op           0 B/op          0 allocs/op
BenchmarkImageSize_AppendText-16        500286883                2.402 ns/op           0 B/op          0 allocs/op
BenchmarkImageSize_MarshalText-16       81467318                16.46 ns/op            8 B/op          1 allocs/op
BenchmarkImageSize_String-16            856463289                1.330 ns/op           0 B/op          0 allocs/op
PASS
ok      github.com/nikolaydubina/go-enum-encoding/internal/testdata     8.561s

完整示例

下面是一个完整的示例,展示如何使用 go-enum-encoding:

package main

import (
    "encoding/json"
    "fmt"
)

// 定义颜色枚举类型
type Color struct{ c uint8 }

//go:generate go-enum-encoding -type=Color
var (
    UndefinedColor = Color{}  // json:""
    Red            = Color{1} // json:"red"
    Green          = Color{2} // json:"green"
    Blue           = Color{3} // json:"blue"
)

func main() {
    // 序列化示例
    colors := []Color{Red, Green, Blue}
    jsonData, _ := json.Marshal(colors)
    fmt.Println(string(jsonData)) // 输出: ["red","green","blue"]

    // 反序列化示例
    var decodedColors []Color
    json.Unmarshal([]byte(`["red","green","blue"]`), &decodedColors)
    fmt.Printf("%+v\n", decodedColors) // 输出: [{c:1} {c:2} {c:3}]
}

使用步骤:

  1. 定义枚举类型和值
  2. 添加 //go:generate 注释
  3. 为每个枚举值添加 JSON 标签注释
  4. 运行 go generate 生成代码
  5. 在代码中使用生成的序列化/反序列化方法

这个工具特别适合需要将枚举值序列化为 JSON 或其他文本格式的场景,它生成的代码性能优异且内存效率高。


更多关于golang通过代码注释自动生成枚举编码插件库go-enum-encoding的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang通过代码注释自动生成枚举编码插件库go-enum-encoding的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go-enum-encoding 使用指南

go-enum-encoding 是一个通过代码注释自动生成枚举编码的 Go 语言插件库,它可以帮助开发者快速实现枚举类型的字符串和整型值之间的转换。

安装

首先需要安装代码生成工具:

go install github.com/abice/go-enum@latest

基本用法

1. 定义枚举类型

在你的代码中定义一个枚举类型,并添加特殊的注释标记:

// 使用 go:generate 指令告诉 Go 工具链如何生成代码
//go:generate go-enum --marshal --names

// Status 表示状态枚举
// ENUM(
//   Pending = 0
//   Approved = 1
//   Rejected = 2
// )
type Status int

2. 生成代码

运行以下命令生成代码:

go generate ./...

这将生成一个 status_enum.go 文件,包含所有必要的枚举方法。

生成的功能

生成的代码将包含以下功能:

  1. 字符串转换

    var s Status = Approved
    fmt.Println(s.String()) // 输出 "Approved"
    
  2. 从字符串解析

    var s Status
    err := s.UnmarshalText([]byte("Approved"))
    // s 现在是 Approved
    
  3. JSON 编解码

    // 编码
    data, _ := json.Marshal(Approved) // 输出 "Approved"
    
    // 解码
    var s Status
    json.Unmarshal([]byte(`"Approved"`), &s)
    
  4. 数据库编解码

    // 用于 SQL 驱动
    value, _ := Approved.Value() // 返回 "Approved" 字符串
    
    var s Status
    s.Scan("Approved") // 从数据库读取
    

高级配置

自定义字符串表示

// ENUM(
//   Pending = 0 // 待处理
//   Approved = 1 // 已批准
//   Rejected = 2 // 已拒绝
// )
type Status int

这样生成的字符串将是中文注释内容。

自定义前缀/后缀

// ENUM(
//   StatusPending
//   StatusApproved
//   StatusRejected
// )
type Status int

生成的字符串将去掉 “Status” 前缀。

位掩码枚举

// ENUM(
//   Read = 1 << 0 // 1
//   Write = 1 << 1 // 2
//   Execute = 1 << 2 // 4
// )
type Permission int

支持位操作枚举值。

完整示例

package main

import (
	"encoding/json"
	"fmt"
)

//go:generate go-enum --marshal --names --sql --flag

// Color 颜色枚举
// ENUM(
//   Red = 1 // 红色
//   Green = 2 // 绿色
//   Blue = 3 // 蓝色
// )
type Color int

func main() {
	// 字符串表示
	fmt.Println(ColorRed.String()) // 输出 "红色"

	// 从字符串解析
	var c Color
	c.UnmarshalText([]byte("绿色"))
	fmt.Println(c) // 输出 2

	// JSON 编码
	data, _ := json.Marshal(ColorBlue)
	fmt.Println(string(data)) // 输出 "蓝色"

	// JSON 解码
	var c2 Color
	json.Unmarshal([]byte(`"红色"`), &c2)
	fmt.Println(c2) // 输出 1

	// 命令行标志支持
	var colorFlag Color
	flag.Var(&colorFlag, "color", "颜色选项")
	// 使用: ./program -color 绿色
}

生成选项

常用的生成选项:

  • --marshal: 生成 JSON 编解码方法
  • --names: 使用注释作为字符串值
  • --sql: 生成数据库编解码方法
  • --flag: 生成命令行标志支持
  • --prefix: 去除枚举值前缀
  • --nocase: 忽略大小写匹配

总结

go-enum-encoding 通过简单的注释就能为枚举类型生成丰富的功能代码,大大减少了样板代码的编写。它特别适合需要频繁进行枚举值转换、序列化或数据库存储的场景。通过合理使用生成选项,可以灵活控制生成代码的功能范围。

回到顶部