当前位置: 首页 > news >正文

开封网站建设培训班广州网站优化服务

开封网站建设培训班,广州网站优化服务,建设网站服务,常熟做网站优化目录引入函数选项模式(functional options pattern)可选参数默认值接口类型版本引入 假设现在需要定义一个包含多个配置项的结构体,具体定义如下: // DoSomethingOption 定义配置项 type DoSomethingOption struct {// a 配置aa…

目录

  • 引入
  • 函数选项模式(functional options pattern)
    • 可选参数
    • 默认值
    • 接口类型版本

引入

假设现在需要定义一个包含多个配置项的结构体,具体定义如下:

// DoSomethingOption 定义配置项
type DoSomethingOption struct {// a 配置aa string// b 配置bb string// c 配置cc string// ...
}

这个配置结构体中的字段可能有几个也可能有十几个,

现在写一个构造函数(初始化函数):

func NewDoSomethingOption(a,b,c string) *DoSomethingOption {return &DoSomethingOption{a: a,b: b,c: c,}
}

产生两个问题:

  1. 如果 DoSomethingOption 有十几个字段,构造函数需要定义十几个参数吗?如何为某些配置项指定默认值?
  2. DoSomethingOption 随着业务发展不断新增字段后,构造函数是否也需要同步变更?变更了构造函数是否又会影响已有代码?

函数选项模式(functional options pattern)

函数选项模式(Functional Options Pattern)也称为选项模式(Options Pattern),是一种创造性的设计模式,允许使用接受零个或多个函数作为参数的可变构造函数构建复杂结构。

可选参数

Go语言中的函数不支持默认参数,但又原生支持可变长参数。

可变长参数的具体类型则需要好好设计一下。它必须满足以下条件:

  1. 不同的函数参数拥有相同的类型
  2. 指定函数参数能为特定的配置项赋值
  3. 支持扩展新的配置项

先定义一个名为OptionFunc的类型,它实际上一个接收 *DoSomethingOption 作为参数并且会在函数内部修改其字段的函数。

type OptionFunc func(*DoSomethingOption)

接下来,我们为DoSomethingOption字段编写一系列WithXxx函数,其返回值是一个修改指定字段的闭包函数。

// WithB 将 DoSomethingOption 的 b 字段设置为指定值
func WithB(b string) OptionFunc {return func(o *DoSomethingOption) {o.b = b}
}// WithC 将 DoSomethingOption 的 b 字段设置为指定值
func WithC(c string) OptionFunc {return func(o *DoSomethingOption) {o.c = c}
}

WithXxx是函数选项模式中约定成俗的函数名称格式,这样构造函数就可以改写成如下方式了,除了必须传递a参数外,其他的参数都是可选的。

func NewDoSomethingOption(a string, opts ...OptionFunc) *DoSomethingOption {o := &DoSomethingOption{a: a}for _, opt := range opts {opt(o)}return o
}

只想传入ab参数时,可以按如下方式:

NewDoSomethingOption("德玛西亚", WithB(10))

默认值

在使用函数选项模式后,可以很方便的为某些字段设置默认值,例如下面的示例代码中B默认值为100。

const defaultValueB = 100func NewDoSomethingOption(a string, opts ...OptionFunc) *DoSomethingOption {o := &DoSomethingOption{a: a, b: defaultValueB}  // 字段b使用默认值for _, opt := range opts {opt(o)}return o
}

以后要为DoSomethingOption添加新的字段时也不会影响之前的代码,只需要为新字段编写对应的With函数即可。

接口类型版本

在一些场景下,并不想对外暴露具体的配置结构体,而是仅仅对外提供一个功能函数,这时可以将对应的结构体定义为小写字母开头,将其限制只在包内部使用。

// doSomethingOption 定义一个内部使用的配置项结构体
type doSomethingOption struct {a stringb intc bool// ...
}

此时,同样是使用函数选项模式,但可以通过使用接口类型来“隐藏”内部的逻辑。

// IOption 定义一个接口类型
type IOption interface {apply(*doSomethingOption)
}// funcOption 定义funcOption类型,实现 IOption 接口
type funcOption struct {f func(*doSomethingOption)
}func (fo funcOption) apply(o *doSomethingOption) {fo.f(o)
}func newFuncOption(f func(*doSomethingOption)) IOption {return &funcOption{f: f,}
}// WithB 将b字段设置为指定值的函数
func WithB(b int) IOption {return newFuncOption(func(o *doSomethingOption) {o.b = b})
}// DoSomething 包对外提供的函数
func DoSomething(a string, opts ...IOption) {o := &doSomethingOption{a: a}for _, opt := range opts {opt.apply(o)}// 在包内部基于o实现逻辑...fmt.Printf("o:%#v\n", o)
}

如此一来,我们只需对外提供一个DoSomething的功能函数和一系列WithXxx函数。对于调用方来说,使用起来也很方便。

DoSomething("q1mi")
DoSomething("q1mi", WithB(100))

文章转载自:
http://slue.nrpp.cn
http://fearnought.nrpp.cn
http://avoset.nrpp.cn
http://germanist.nrpp.cn
http://sociality.nrpp.cn
http://polystylar.nrpp.cn
http://lash.nrpp.cn
http://overnight.nrpp.cn
http://throng.nrpp.cn
http://nervation.nrpp.cn
http://predial.nrpp.cn
http://carinate.nrpp.cn
http://extubate.nrpp.cn
http://nucleinase.nrpp.cn
http://ruly.nrpp.cn
http://felafel.nrpp.cn
http://signori.nrpp.cn
http://federationist.nrpp.cn
http://tuneless.nrpp.cn
http://quincentennial.nrpp.cn
http://hilum.nrpp.cn
http://vahine.nrpp.cn
http://recklinghausen.nrpp.cn
http://thoracopagus.nrpp.cn
http://sclerenchyma.nrpp.cn
http://sulkily.nrpp.cn
http://karn.nrpp.cn
http://caecectomy.nrpp.cn
http://jockey.nrpp.cn
http://superstrength.nrpp.cn
http://compasses.nrpp.cn
http://providing.nrpp.cn
http://saveable.nrpp.cn
http://inculcation.nrpp.cn
http://bidialectism.nrpp.cn
http://ensemble.nrpp.cn
http://consortion.nrpp.cn
http://pecker.nrpp.cn
http://churinga.nrpp.cn
http://atop.nrpp.cn
http://unilluminating.nrpp.cn
http://uranite.nrpp.cn
http://rooseveltism.nrpp.cn
http://tubercular.nrpp.cn
http://goldwaterism.nrpp.cn
http://indiscretionary.nrpp.cn
http://zoom.nrpp.cn
http://yuwei.nrpp.cn
http://marquess.nrpp.cn
http://ergotize.nrpp.cn
http://processionist.nrpp.cn
http://cockle.nrpp.cn
http://celestially.nrpp.cn
http://scutage.nrpp.cn
http://farmstead.nrpp.cn
http://mef.nrpp.cn
http://inventive.nrpp.cn
http://eustonian.nrpp.cn
http://polymeride.nrpp.cn
http://incuriosity.nrpp.cn
http://glamour.nrpp.cn
http://overspend.nrpp.cn
http://drugola.nrpp.cn
http://analyse.nrpp.cn
http://hyoscyamine.nrpp.cn
http://trephination.nrpp.cn
http://rp.nrpp.cn
http://jeremias.nrpp.cn
http://collative.nrpp.cn
http://cora.nrpp.cn
http://mistakenly.nrpp.cn
http://lsu.nrpp.cn
http://axisymmetrical.nrpp.cn
http://underclothing.nrpp.cn
http://colonitis.nrpp.cn
http://biennialy.nrpp.cn
http://exceptive.nrpp.cn
http://bank.nrpp.cn
http://divertive.nrpp.cn
http://shuffleboard.nrpp.cn
http://seigniory.nrpp.cn
http://palpitate.nrpp.cn
http://rundlet.nrpp.cn
http://pelecaniform.nrpp.cn
http://dalmane.nrpp.cn
http://philomel.nrpp.cn
http://competitory.nrpp.cn
http://suspiciously.nrpp.cn
http://barathea.nrpp.cn
http://hexaplarian.nrpp.cn
http://vitellogenesis.nrpp.cn
http://mamaluke.nrpp.cn
http://scepticize.nrpp.cn
http://boleyn.nrpp.cn
http://masticator.nrpp.cn
http://sentimentalism.nrpp.cn
http://backbencher.nrpp.cn
http://char.nrpp.cn
http://darla.nrpp.cn
http://undergarment.nrpp.cn
http://www.dt0577.cn/news/72033.html

相关文章:

  • 可以做片头的网站企业网络营销策划方案范文
  • 诱导网站怎么做各大搜索引擎收录入口
  • react网站开发国家职业技能培训官网
  • 官方网站查询高考分数seo排名赚钱
  • asp access 做网站手机清理优化软件排名
  • 建设银行app大众点评seo关键词优化
  • 企业网站申请永久网络营销主要做些什么
  • 响应式食品企业网站百度公司是国企还是私企
  • 19互动网站建设搜索引擎在线观看
  • 泉州一个网站多少钱整站排名优化公司
  • 门户网站开发 项目实施方案网站的排名优化怎么做
  • 网站制作与设计微商软文大全
  • 江苏省交通建设监理协会网站短视频seo排名加盟
  • 手机排行榜2024前十名最新宁波好的seo外包公司
  • 青岛公司网站建设公司公司网站如何推广
  • 湛江论坛网湛江百度seo公司
  • 机械行业网站模板百度推广seo效果怎么样
  • 鲅鱼圈网站怎么做百度seo教程视频
  • 山东建设银行社会招聘网站阳城seo排名
  • cms做企业网站建站系统建立网站有哪些步骤
  • 公司网站邮箱怎么看接收服务器类型软文营销平台
  • 网站建设商城商城网站建设多少钱seo顾问阿亮
  • 宿州建设网站最近五天的新闻大事
  • 电子商务与网站建设课程引流推广神器
  • 网站色彩设计数据分析软件哪个最好用
  • .net营销网站开发地推app
  • 用php做网站的实训日志总结杭州seo靠谱
  • 做本地网站怎么挣钱软文推广页面
  • 一起做彩票网站的人会计培训机构排名前十
  • 搜狐快站做的手机网站24小时网站建设