Go开发go-optioner工具实现轻松生成函数选项模式代码

 更新时间:2023年07月25日 08:45:36   作者:Go技术干货  
go-optioner 是一个在 Go 代码中生成函数选项模式代码的工具,可以根据给定的结构定义自动生成相应的选项代码,下面就来聊聊go-optioner是如何使用的吧

前言

最近在进行重构代码时,我遇到了一个问题:在使用函数选项模式来构造一个结构体时,由于该结构体字段过多,我需要手动编写大量的设置选项函数的代码。这样的工作既繁琐又容易出错。

为了解决这个问题,我开始在 github 上面寻找能够根据结构体的定义自动生成函数选项模式代码的工具,尽管找到了几个相关工具,但并没有完全符合我的要求。因此我决定自己动手,开发了 go-optioner 工具,并将其推荐给大家使用。

go-optioner

go-optioner 是一个在 Go 代码中生成函数选项模式代码的工具。该工具可以根据给定的结构定义自动生成相应的选项代码。

安装

1、go install github.com/chenmingyong0423/go-optioner/cmd/optioner@latest

2、执行 optioner 命令检查是否安装成功

> optioner
optioner is a tool for generating functional options pattern.
Usage: 
         optioner [flags]
Flags:
         -type <struct name>
         -output <output path>, default: srcDir/opt_xxx_gen.go

如果你安装成功了,但是提示 optioner 命令找不到,请确认是否已将 $GOPATH/bin 添加到环境变量中。

使用教程

你可以直接使用 optioner 命令生成对应结构体的 functional options 代码,也可以使用 go generate 命令进行批量生成。

optioner 命令

1、首先,你需要创建一个包含需要生成函数选项模式代码的结构体的 Go 文件。在结构体字段中,您可以使用 opt 标签来控制是否为 NewXXX() 函数的必传参数和生成相应的函数。

package example
type User struct {
    Name   string`opt:"-"`
    Age    int
    Gender string
}

如果字段定义了 opt 标签,并且值为 -,则它将作为 NewXXX 函数的必要参数,并且不会生成该字段的 WithXXX 函数。

注意:必须声明 package

2、在包含结构体定义的文件目录下,执行 optioner -type XXX 命令,其中 XXX 是结构体的名称。执行命令之后,optioner 工具会根据结构体定义生成相应的函数选项模式代码。内容如下所示:

// Generated by optioner -type User; DO NOT EDIT
// If you have any questions, please create issues and submit contributions at:
// https://github.com/chenmingyong0423/go-optioner
package example
type UserOption func(*User)
func NewUser(name string, opts ...UserOption) *User {
    user := &User{
        Name: name,
    }
    for _, opt := range opts {
        opt(user)
    }
    return user
}
func WithAge(age int) UserOption {
    returnfunc(user *User) {
        user.Age = age
    }
}
func WithGender(gender string) UserOption {
    returnfunc(user *User) {
        user.Gender = gender
    }
}

optioner 工具将会生成一个名为 opt_xxx_gen.go 的文件,其中 xxx 是结构体的名称,例如 opt_user_gen.go。该文件包含生成的函数选项代码,用于初始化结构体和设置结构体字段的值。

go generate 命令

请注意,在执行 go generate 命令之前,确保您的项目已经初始化 Go Modules 或正确设置了 GOPATH,并且您的项目结构符合 Go Modules 或 GOPATH 的要求。

1、首先,你需要创建一个包含需要生成函数选项模式代码的结构体的 Go 文件。在结构体定义之上,你需要添加 //go:generate optioner -type XXX 的注释,其中 XXX 是结构体的名称。这样工具就能根据参数生成相应的代码。在结构体字段中,您可以使用 opt 标签来控制是否为 NewXXX() 函数的必传参数和生成相应的函数。

package example
//go:generate optioner -type User
type User struct {
    Name   string`opt:"-"`
    Age    int
    Gender string
}

如果字段定义了 opt 标签,并且值为 -,则它将作为 NewXXX 函数的必要参数,并且不会生成该字段的 WithXXX 函数。

注意:必须声明 package

2、在包含结构体定义的文件目录下,执行 go generate 命令,这将调用 optioner 工具并根据结构体定义生成相应的函数选项模式代码。内容如下所示:

// Generated by optioner -type User; DO NOT EDIT
// If you have any questions, please create issues and submit contributions at:
// https://github.com/chenmingyong0423/go-optioner
package example
type UserOption func(*User)
func NewUser(name string, opts ...UserOption) *User {
    user := &User{
        Name: name,
    }
    for _, opt := range opts {
        opt(user)
    }
    return user
}
func WithAge(age int) UserOption {
    returnfunc(user *User) {
        user.Age = age
    }
}
func WithGender(gender string) UserOption {
    returnfunc(user *User) {
        user.Gender = gender
    }
}

optioner 工具将会生成一个名为 opt_xxx_gen.go 的文件,其中 xxx 是结构体的名称,例如 opt_user_gen.go。该文件包含生成的函数选项代码,用于初始化结构体和设置结构体字段的值。

小结

在本文中,我介绍了 go-opioner 开源工具的安装和使用,它能够根据结构体的定义,自动生成函数选项模式的代码。它让我们告别繁琐的构造函数编写和修改,让代码编写过程更加高效和愉悦。

到此这篇关于Go开发go-optioner工具实现轻松生成函数选项模式代码的文章就介绍到这了,更多相关Go go-optioner内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言中常用json处理操作小结

    Go语言中常用json处理操作小结

    在 Go 中,你可以使用内置的 encoding/json 包来处理 JSON 格式数据,本文整理了一些常见的 JSON 处理操作,希望对大家有所帮助
    2024-04-04
  • 一文搞懂Go语言标准库strconv

    一文搞懂Go语言标准库strconv

    strconv包实现了基本数据类型和其字符串表示的相互转换,本文主要介绍Go语言标准库strconv,想要学习strconv标准库的可以了解一下
    2023-04-04
  • 深入解析Go语言中上下文超时与子进程管理

    深入解析Go语言中上下文超时与子进程管理

    这篇文章小编将通过一个实际问题的案例,和大家深入探讨一下Go语言中的上下文超时和子进程管理,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • golang 监听服务的信号,实现平滑启动,linux信号说明详解

    golang 监听服务的信号,实现平滑启动,linux信号说明详解

    这篇文章主要介绍了golang 监听服务的信号,实现平滑启动,linux信号说明详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • 使用Go语言实现HTTP客户端请求并解析响应的完整流程

    使用Go语言实现HTTP客户端请求并解析响应的完整流程

    在日常开发中,无论是调用 RESTful API、采集网页数据,还是进行微服务之间的通信,HTTP 客户端几乎无处不在,本文聚焦于如何使用 Go 实现一个 HTTP 客户端,完成请求发送、响应解析、错误处理、Header与Body提取等完整流程,需要的朋友可以参考下
    2025-08-08
  • Go语言使用make进行内存分配的代码示例

    Go语言使用make进行内存分配的代码示例

    在Go语言里,内存分配是程序开发中的关键环节,make是Go语言内置的一个重要函数,专门用于为切片(slice)、映射(map)和通道(channel)这三种引用类型分配内存并初始化,本文将深入剖析 make 函数的使用,结合代码示例与实际项目场景,帮助开发者更好地掌握这一特性
    2025-06-06
  • golang实现一个简单的websocket聊天室功能

    golang实现一个简单的websocket聊天室功能

    这篇文章主要介绍了golang实现一个简单的websocket聊天室功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • Go语言必知的5个核心知识点之init、路径、输出、切片、Map

    Go语言必知的5个核心知识点之init、路径、输出、切片、Map

    数组和切片是 Go 语言中常见的数据结构,很多刚刚使用 Go 的开发者往往会混淆这两个概念,当然还有其他的一些知识点,这篇文章主要介绍了Go语言必知的5个核心知识点之init、路径、输出、切片、Map的相关资料,需要的朋友可以参考下
    2026-05-05
  • 利用golang的字符串解决leetcode翻转字符串里的单词

    利用golang的字符串解决leetcode翻转字符串里的单词

    这篇文章主要介绍了利用golang的字符串解决leetcode翻转字符串里的单词,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 一文带你了解Golang中强大的重试机制

    一文带你了解Golang中强大的重试机制

    在 Go 语言中,处理瞬态错误是常见的挑战,这些错误可能会在一段时间后自动恢复,因此,重试机制在这些情况下非常重要,所以本文就来和大家聊聊Golang中强大的重试机制吧
    2025-01-01

最新评论