重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
现在有个结构体如下定义:
涡阳网站制作公司哪家好,找成都创新互联公司!从网页设计、网站建设、微信开发、APP开发、自适应网站建设等网站项目制作,到程序开发,运营维护。成都创新互联公司2013年开创至今到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选成都创新互联公司。
我们需要初始化结构体,如果是其他语言,函数支持默认参数:
但是,go语言函数不支持默认参数,同时即使go语言支持默认参数,但是如果配置项过多,那么每一个配置项都得写一个默认参数,也不现实。
那么,在go语言中,我们怎么优雅的给其初始化呢,这时,就需要利用选项模式了(option)。
首先,我们定义一个option函数类型:
它接收一个参数: *Server 。
然后定义一个 NewServer 函数,它接收一个 Option类型的不定参数:
最后,再直接定义一系列返回 Option的函数
使用时,直接:
golang定义可变参数的函数方法是:
—- 采用ANSI标准形式时,参数个数可变的函数的原型声明是:
type funcname(type para1, type para2, …)
—- 这种形式至少需要一个普通的形式参数,后面的省略号不表示省略,而是函数原型的一部分。type是函数返回值和形式参数的类型。
—- 采用与UNIX System V兼容的声明方式时,参数个数可变的函数原型是:
type funcname(va_alist)
va_dcl
—- 这种形式不需要提供任何普通的形式参数。
type是函数返回值的类型。va_dcl是对函数原型声明中参数va_alist的详细声明,实际是一个宏定义,对不同的硬件平台采用不同的类型来定义,但在最后都包括了一个分号。因此va_dcl后不再需要加上分号了。va_dcl在代码中必须原样给出。va_alist在VC中可以原样给出,也可以略去。
此外,采用头文件stdarg.h编写的程序是符合ANSI标准的,可以在各种操作系统和硬件上运行;而采用头文件varargs.h的方式仅仅是为了与以前的程序兼容。所以建议使用前者。
大家好,我是小白,有点黑的那个白。
最近遇到一个问题,因为业务需求,需要对接第三方平台.
而三方平台提供的一些HTTP(S)接口都有统一的密钥生成规则要求.
为此我们封装了一个独立的包 xxx-go-sdk 以便维护和对接使用.
其中核心的部分是自定义HTTP Client,如下:
一些平台会要求appKey/appSecret等信息,所以Client结构体就变成了这样,这时参数还比较少, 而且是必填的参数,我们可以提供构造函数来明确指定。
看起来很满足,但是当我们需要增加一个 Timeout 参数来控制超时呢?
或许你会说这还不简单,像下面一样再加一个参数呗
那再加些其他的参数呢?那构造函数的参数是不是又长又串,而且每个参数不一定是必须的,有些参数我们又会考虑默认值的问题。
为此,勤劳但尚未致富的 gophers 们使用了总结一种实践模式
首先提取所有需要的参数到一个独立的结构体 Options,当然你也可以用 Configs 啥的.
然后为每个参数提供设置函数
这样我们就为每个参数设置了独立的设置函数。返回值 func(*Options) 看着有点不友好,我们提取下定义为单个 Option 调整一下代码
当我们需要添加更多的参数时,只需要在 Options 添加新的参数并添加新参数的设置函数即可。
比如现在要添加新的参数 Timeout
这样后续不管新增多少参数,只需要新增配置项并添加独立的设置函数即可轻松扩展,并且不会影响原有函数的参数顺序和个数位置等。
至此,每个选项是区分开来了,那么怎么作用到我们的 Client 结构体上呢?
首先,配置选项都被提取到了 Options 结构体重,所以我们需要调整一下 Client 结构体的参数
其次,每一个选项函数返回 Option,那么任意多个就是 ...Option,我们调整一下构造函数 NewClient 的参数形式,改为可变参数,不再局限于固定顺序的几个参数。
然后循环遍历每个选项函数,来生成Client结构体的完整配置选项。
那么怎么调用呢?对于调用方而已,直接在调用构造函数NewClient()的参数内添加自己需要的设置函数(WithXXX)即可
当需要设置超时参数,直接添加 WithTimeout即可,比如设置3秒的超时
配置选项的位置可以任意设置,不需要受常规的固定参数顺序约束。
可以看到,这种实践模式主要作用于配置选项,利用函数支持的特性来实现的,为此得名 Functional Options Pattern,优美的中国话叫做「函数选项模式」。
最后, 我们总结回顾一下在Go语言中函数选项模式的优缺点