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

简介: 你是否使用过 functional options 函数选项模式?在使用时,你是否遇到过多字段的结构体而需要手动编写大量的设置选项函数的代码?本文介绍了 go-opioner 开源工具的安装和使用,它能够根据结构体的定义,自动生成函数选项模式的代码。

作者:陈明勇
个人网站:https://chenmingyong.cn
文章持续更新,如果本文能让您有所收获,欢迎关注本号。
微信阅读可搜《Go 技术干货》。这篇文章已被收录于 GitHub https://github.com/chenmingyong0423/blog 欢迎大家 Star 催更并持续关注。

前言

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

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

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

欢迎 Star,如果有任何问题或提供功能的改进方案,欢迎提交 IssuesPull Request(PR)

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 {
         
          return func(user *User) {
         
              user.Age = age
          }
      }
    
      func WithGender(gender string) UserOption {
         
          return func(user *User) {
         
              user.Gender = gender
          }
      }
    

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

go generate 命令

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

  • 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 {
         
          return func(user *User) {
         
              user.Age = age
          }
      }
    
      func WithGender(gender string) UserOption {
         
          return func(user *User) {
         
              user.Gender = gender
          }
      }
    

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

小结

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

希望各位开发者能够踊跃给 go-optioner 点予星标(Star),以示支持和认可。您的支持是持续改进和优化工具的动力。同时,也欢迎各位提交 IssuesPull Request(PR),为 go-optioner 提出宝贵的意见和贡献更好的功能和改进。

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

目录
相关文章
|
4月前
|
人工智能 Kubernetes Java
回归开源,两位 Java 和 Go 程序员分享的开源贡献指引
Higress是一个基于Istio和Envoy的云原生API网关,支持AI功能扩展。它通过Go/Rust/JS编写的Wasm插件提供可扩展架构,并包含Node和Java的console模块。Higress起源于阿里巴巴,解决了Tengine配置重载及gRPC/Dubbo负载均衡问题,现已成为阿里云API网关的基础。本文介绍Higress的基本架构、功能(如AI网关、API管理、Ingress流量网关等)、部署方式以及如何参与开源贡献。此外,还提供了有效的开源贡献指南和社区交流信息。
510 33
|
4月前
|
人工智能 安全 算法
Go入门实战:并发模式的使用
本文详细探讨了Go语言的并发模式,包括Goroutine、Channel、Mutex和WaitGroup等核心概念。通过具体代码实例与详细解释,介绍了这些模式的原理及应用。同时分析了未来发展趋势与挑战,如更高效的并发控制、更好的并发安全及性能优化。Go语言凭借其优秀的并发性能,在现代编程中备受青睐。
149 33
|
4月前
|
Go 调度
GO语言函数的内部运行机制分析
以上就是Go语言中函数的内部运行机制的概述,展示了函数在Go语言编程中如何发挥作用,以及Go如何使用简洁高效的设计,使得代码更简单,更有逻辑性,更易于理解和维护。尽管这些内容深入了一些底层的概念,但我希望通过这种方式,将这些理论知识更生动、更形象地带给你,让你在理解的同时找到编程的乐趣。
68 5
|
4月前
|
Go Python
函数的定义与调用 -《Go语言实战指南》
本文介绍了 Go 语言中函数的核心特性与用法,包括基本定义格式、调用方式、多返回值、返回值命名、参数类型简写、可变参数、高阶函数及匿名函数等内容。通过示例代码详细展示了如何定义和使用不同类型的函数,使读者能够全面了解 Go 函数的灵活性与强大功能。
|
7月前
|
算法 测试技术 Go
Go 1.24.0 重磅发布:新特性、新工具,开发者必看!
`Go 1.24.0` 已正式发布,带来诸多改进和新特性。语言层面上,泛型类型别名现已被完全支持;性能方面,通过优化 `map` 实现和内存分配,减少了 2-3% 的 CPU 开销;工具链新增模块工具依赖跟踪及测试分析器;标准库增加了弱引用包、FIPS 140-3 合规机制等;WebAssembly 支持也得到了增强。快来下载体验吧!
384 7
|
10月前
|
Go 调度 开发者
探索Go语言中的并发模式:goroutine与channel
在本文中,我们将深入探讨Go语言中的核心并发特性——goroutine和channel。不同于传统的并发模型,Go语言的并发机制以其简洁性和高效性著称。本文将通过实际代码示例,展示如何利用goroutine实现轻量级的并发执行,以及如何通过channel安全地在goroutine之间传递数据。摘要部分将概述这些概念,并提示读者本文将提供哪些具体的技术洞见。
|
10月前
|
编译器 Go
go语言编译选项
【10月更文挑战第17天】
188 5
|
10月前
|
安全 Go 开发者
代码之美:Go语言并发编程的优雅实现与案例分析
【10月更文挑战第28天】Go语言自2009年发布以来,凭借简洁的语法、高效的性能和原生的并发支持,赢得了众多开发者的青睐。本文通过两个案例,分别展示了如何使用goroutine和channel实现并发下载网页和构建并发Web服务器,深入探讨了Go语言并发编程的优雅实现。
167 2
|
10月前
|
JSON 安全 网络协议
go语言使用内置函数和标准库
【10月更文挑战第18天】
134 3
|
10月前
|
SQL 监控 算法
为Go应用无侵入地添加任意代码
这篇文章旨在提供技术深度和实践指南,帮助开发者理解并应用这项创新技术来提高Golang应用的监控与服务治理能力。在接下来的部分,我们将通过一些实际案例,进一步展示如何在不同场景中应用这项技术,提供更多实践启示。