Golang中使用函数式编程方式实现可选参数(功能配置项)配置

开发 前端
只有Host和Port是必选项,Timeout和RetryNum会给默认值,实例化这个结构体的时候这两个参数是可选的。

场景带入

日常开发中,封装相关的库时,例如封装微信支付sdk、MySQL ORM、自定义的Server端等,都会给出很多相关的配置,例如:

type Client struct {
host string
port string
timeout time.Duration
retryNum int
}

其中只有host和port是必选项,timeout和retryNum会给默认值,实例化这个结构体的时候这两个参数是可选的。

封装的库一般需要做到以下几点:

  • 需要一个实例化结构体的方法,需要必选参数,可选项需要处理为可选参数。
  • 可选配置可以按需灵活传入,任意顺序传递参数。
  • 新增一个可选配置项不需要大面积改代码,容易扩展和维护。
  • 结构体里面的属性需要设置为不可导出,即在包外部不能修改。

使用函数式编程方式的实现方法

先通过一个代码片段来看一下使用函数式编程方式是怎么实现的:

package main

import (
"fmt"
"time"
)

type Client struct {
host string
port string
timeout time.Duration
retryNum int
}

type Option func(*Client)

func NewClient(host, port string, opt ...Option) *Client {
c := Client{
host: host,
port: port,
timeout: time.Second,
retryNum: 1,
}
for _, option := range opt {
option(&c)
}
return &c
}

func Timeout(timeout time.Duration) Option {
return func(c *Client) {
c.timeout = timeout
}
}

func RetryNum(num int) Option {
return func(c *Client) {
c.retryNum = num
}
}

使用方法是这样的,只传入必传参数。

func main() {
client := NewClient("localhost", "8080")
}

传入可选参数timeout:

func main() {
client := NewClient("localhost", "8080", Timeout(2*time.Second))
}

传入可选参数retryNum。

func main() {
client := NewClient("localhost", "8080", RetryNum(3))
}

传入timeout和retryNum。

func main() {
client = NewClient("localhost", "8080", Timeout(2*time.Second), RetryNum(3))
// 或者
// client = NewClient("localhost", "8080", RetryNum(3), Timeout(2*time.Second))
}

以上面的Timeout函数为例,这个函数返回的一个函数来设置传入的配置项,Timeout就是一个高阶函数。

小结

上面的实现方式有个专业术语叫做 Functional Options,使用这种编程模式有很多好处:

  • 易读性强,容易理解。
  • 方便扩展,容易维护。
  • 参数传递不需要先后顺序。
责任编辑:姜华 来源: 今日头条
相关推荐

2009-06-22 15:10:00

java 编程AOP

2019-01-17 10:25:56

Python编程语言程序员

2022-09-22 08:19:26

WebFlux函数式编程

2010-01-19 13:36:16

VB.NET可选参数

2010-03-02 16:05:48

WCF端点配置

2023-02-23 19:31:05

Golang函数重载

2024-01-17 06:23:35

SwiftTypeScript定义函数

2018-06-11 12:53:53

LinuxStratis本地存储

2015-08-19 15:45:33

2022-09-26 08:54:39

Spring函数式编程

2021-12-22 09:34:01

Golagn配置方式

2013-09-09 09:41:34

2022-11-06 21:50:59

Python编程函数定义

2009-06-19 13:45:53

Java应用程序Jfreechart

2022-02-08 17:07:54

Spring BooSpring Aop日志记录

2021-03-24 10:31:10

JS函数式编程前端

2018-11-15 10:20:59

Python函数式编程编程语言

2015-09-28 14:54:08

Java函数式编程

2010-06-07 16:23:06

HadoopOnDem

2015-12-15 09:58:19

golang环境配置建议
点赞
收藏

51CTO技术栈公众号