首页 > 其他分享 >go-optioner:轻松生成函数选项模式代码

go-optioner:轻松生成函数选项模式代码

时间:2023-08-31 18:33:24浏览次数:38  
标签:选项 opt Go user go optioner User

[Go开源工具] go-optioner:轻松生成函数选项模式代码

原创 陈明勇 Go技术干货 2023-07-25 08:02 发表于广东 收录于合集#Go 开源1个

大家好,我是 陈明勇,一个热爱技术,喜欢专研技术的程序员。

Go技术干货 专注于分享 Go 技术干货知识(基础、进阶、原理等)。 50篇原创内容 公众号

欢迎关注公众号:Go技术干货,进群与众多 Gopher 交流学习,或订阅网站 https://chenmingyong.cn 一起学习,一起进步!

Tip: 将公众号设为星标,永不错过重要的文章推送。

如果本文能让你有所收获,点赞在看转发 是对我莫大的鼓励和支持!

前言

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

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

工具链接: https://github.com/chenmingyong0423/go-optioner 

欢迎 Star,如果有任何问题或提供功能的改进方案,欢迎提交 Issues 和 Pull Request

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-optioner 点点星标(Star),以示支持和认可。您的支持是持续改进和优化工具的动力。同时,也欢迎各位提交 Issues 和 Pull Request(PR),为 go-optioner 提出宝贵的意见和贡献更好的功能和改进。

工具链接: https://github.com/chenmingyong0423/go-optioner



Go技术干货 专注于分享 Go 技术干货知识(基础、进阶、原理等)。 50篇原创内容 公众号

关注我,一起学习,一起进步!

Tip: 将公众号设为星标,永不错过重要的文章推送。

点赞在看转发是对我莫大的鼓励和支持 ↓

陈明勇

赞赏二维码喜欢作者

阅读 1671 Go技术干货 ​ 喜欢此内容的人还喜欢   Go 1.21 新内置函数:min、max 和 clear     Go技术干货 不看的原因   Go同步原语 — sync.Cond     码一行 不看的原因   wasm 初探,写个 Hello World     前端西瓜哥 不看的原因   关注公众号后可以给作者发消息        

标签:选项,opt,Go,user,go,optioner,User
From: https://www.cnblogs.com/cheyunhua/p/17670202.html

相关文章

  • 性能测试平台RunnerGo
    在当今的软件开发环境中,测试是确保产品质量和稳定性的重要环节。RunnerGo是一款基于Go语言研发的轻量级测试平台,以其强大的功能和易用性成为了测试领域的佼佼者。RunnerGo具有轻量级、全栈式、易用性和高效率等特点,为用户提供了全面的测试解决方案。RunnerGo特点轻量级RunnerGo采用......
  • VSCODE 关闭 go 的test缓存
    Ctrl+,进入设置,搜索gotestFlags点击Editinsettings.json在内添加"-count=1"......
  • P9437 『XYGOI round1』一棵树 题解
    首先这是一道很明显的换根dp。首先注意到要拼接数,所以我们可以先处理出\(num_i=10^{x}\),使得\(10^x>a_i>10^{x-1}\),这样方便我们后面算贡献。我们以这棵树为例子来推状态转移方程。先假设\(dp_u\)表示以\(1\)为根时,从\(u\)的子树的点到\(u\)的权值和。那么\[......
  • Go 数据类型
    数据类型是编程中的重要概念。数据类型指定了变量值的大小和类型。Go是静态类型的,这意味着一旦变量类型被定义,它只能存储该类型的数据。Go有三种基本数据类型:bool:表示布尔值,要么是true,要么是false。数值型:表示整数类型、浮点数值和复数类型。string:表示字符串值。示例以......
  • restful规范和django源码写接口
    一、restful规范1、restful规范是什么,如何来的?一种定义WebAPI接口的设计风格,尤其适用于前后端分离的应用模式中的规范RoyFielding的博士论文提出的2、以后写接口,大致都要遵循如下规范-1数据的安全保障-》url链接一般都采用https协议进行传输--》它比http安全......
  • 对话谷歌首席技术官肖恩,搜索引擎的里程碑,来看看搜索引擎界的大哥Algolia的“快、准、
    原创|文BFT机器人人物背景Character BackgroundSeanMullaney是Algolia(端到端人工智能搜索和发现平台)的首席技术官,也是前Stripe和谷歌高管,拥有扩展工程组织、开发人工智能驱动的搜索和发现工具以及在全球范围内发展API优先解决方案的背景。在Algolia,他负责监督仅次于谷歌的第......
  • django自带的cache缓存框架使用
    https://docs.djangoproject.com/zh-hans/4.2/topics/cache/#top主要步骤官网也写得很清楚了,包含怎么区使用。这里就展示一些配置django-redis来使用#settings.pyCACHES={'default':{#默认,预留'BACKEND':'django_redis.cache.RedisCache','......
  • Golang操作MongoDB
    MongoDB介绍MongoDB是一种非关系型数据库,C++编写的分布式文档型号数据库,内部使用类似于JSON的bson二进制格式。支持单机、主从(废弃)、副本集、Sharding分片等多种高可用架构。具体参考 https://blog.51cto.com/oldlees/7273362驱动驱动:https://www.mongodb.com/docs/drivers/Go驱动......
  • MP3Stego密码爆破
    importsubprocesswithopen("pwd.txt","w")asf:#1000-1301是爆破范围foriinrange(1000,1301):f.write(str(i)+"\n")g=open("pwd.txt","r")#有其他字典可以放上去forjinrange(300):pwd=g.readline()......
  • golang 协程、延迟函数调用、以及恐慌和恢复
    此篇文章将介绍协程和延迟函数调用。协程和延迟函数调用是Go中比较独特的两个特性。恐慌和恢复也将在此篇文章中得到简单介绍。本文并非全面地对这些特性进行介绍,后面的其它文章会陆续补全本文的未介绍的内容。协程(goroutine)现代CPU一般含有多个核,并且一个核可能支持多线程。......