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

沧州网站建设哪家专业哪儿能做邯郸网站建设

沧州网站建设哪家专业,哪儿能做邯郸网站建设,网页界面设计中主要包括哪三个方面,企业策划方案怎么做在Go语言中,我们经常会遇到一个结构体中有很多字段,我们只想设置其中的一部分字段,其他字段都使用默认值的情况,这时可以通过选项模式来解决。 选项模式是指定义一个函数,这个函数的参数是一个结构体指针,…

在Go语言中,我们经常会遇到一个结构体中有很多字段,我们只想设置其中的一部分字段,其他字段都使用默认值的情况,这时可以通过选项模式来解决。

选项模式是指定义一个函数,这个函数的参数是一个结构体指针,这个结构体中包含了所有可选参数,函数根据参数的需求来设置结构体的字段值。

选项模式也是Go项目开发中经常使用到的模式,例如,grpc/grpc-go的NewServer函数,uber-go/zap包的New函数都用到了选项模式。使用选项模式,我们可以创建一个带有默认值的struct变量,并选择性地修改其中一些参数的值。

在Python语言中,创建一个对象时,可以给参数设置默认值,这样在不传入任何参数时,可以返回携带默认值的对象,并在需要时修改对象的属性。这种特性可以大大简化开发者创建一个对象的成本。

而在Go语言中,因为不支持给参数设置默认值,为了既能够创建带默认值的实例,又能够创建自定义参数的实例,不少开发者会通过以下两种方法来实现:

第一种方法,我们要分别开发两个用来创建实例的函数,一个可以创建带默认值的实例,一个可以定制化创建实例。

package optionsimport ("time"
)const (defaultTimeout = 10defaultCaching = false
)type Connection struct {addr    stringcache   booltimeout time.Duration
}// NewConnect creates a connection.
func NewConnect(addr string) (*Connection, error) {return &Connection{addr:    addr,cache:   defaultCaching,timeout: defaultTimeout,}, nil
}// NewConnectWithOptions creates a connection with options.
func NewConnectWithOptions(addr string, cache bool, timeout time.Duration) (*Connection, error) {return &Connection{addr:    addr,cache:   cache,timeout: timeout,}, nil

使用这种方式,创建同一个Connection实例,却要实现两个不同的函数,实现方式很不优雅。

另外一种方法相对优雅些。我们需要创建一个带默认值的选项,并用该选项创建实例:

package optionsimport ("time"
)const (defaultTimeout = 10defaultCaching = false
)type Connection struct {addr    stringcache   booltimeout time.Duration
}type ConnectionOptions struct {Caching boolTimeout time.Duration
}func NewDefaultOptions() *ConnectionOptions {return &ConnectionOptions{Caching: defaultCaching,Timeout: defaultTimeout,}
}// NewConnect creates a connection with options.
func NewConnect(addr string, opts *ConnectionOptions) (*Connection, error) {return &Connection{addr:    addr,cache:   opts.Caching,timeout: opts.Timeout,}, nil
}

使用这种方式,虽然只需要实现一个函数来创建实例,但是也有缺点:为了创建Connection实例,每次我们都要创建ConnectionOptions,操作起来比较麻烦。

那么有没有更优雅的解决方法呢?答案当然是有的,就是使用选项模式来创建实例。以下代码通过选项模式实现上述功能:

package optionsimport ("time"
)type Connection struct {addr    stringcache   booltimeout time.Duration
}const (defaultTimeout = 10defaultCaching = false
)type options struct {timeout time.Durationcaching bool
}// Option overrides behavior of Connect.
type Option interface {apply(*options)
}type optionFunc func(*options)func (f optionFunc) apply(o *options) {f(o)
}func WithTimeout(t time.Duration) Option {return optionFunc(func(o *options) {o.timeout = t})
}func WithCaching(cache bool) Option {return optionFunc(func(o *options) {o.caching = cache})
}// Connect creates a connection.
func NewConnect(addr string, opts ...Option) (*Connection, error) {options := options{timeout: defaultTimeout,caching: defaultCaching,}for _, o := range opts {o.apply(&options)}return &Connection{addr:    addr,cache:   options.caching,timeout: options.timeout,}, nil
}

在上面的代码中,首先我们定义了options结构体,它携带了timeout、caching两个属性。接下来,我们通过NewConnect创建了一个连接,NewConnect函数中先创建了一个带有默认值的options结构体变量,并通过调用

for _, o := range opts {o.apply(&options)
}

来修改所创建的options结构体变量。

需要修改的属性,是在NewConnect时,通过Option类型的选项参数传递进来的。可以通过WithXXX函数来创建Option类型的选项参数:WithTimeout、WithCaching。

Option类型的选项参数需要实现apply(*options)函数,结合WithTimeout、WithCaching函数的返回值和optionFuncapply方法实现,可以知道o.apply(&options)其实就是把WithTimeout、WithCaching传入的参数赋值给options结构体变量,以此动态地设置options结构体变量的属性。

选项模式有很多优点,例如:支持传递多个参数,并且在参数发生变化时保持兼容性;支持任意顺序传递参数;支持默认值;方便扩展;通过WithXXX的函数命名,可以使参数意义更加明确,等等。

不过,为了实现选项模式,我们增加了很多代码,所以在开发中,要根据实际场景选择是否使用选项模式。选项模式通常适用于以下场景:

  • 结构体参数很多,创建结构体时,我们期望创建一个携带默认值的结构体变量,并选择性修改其中一些参数的值。
  • 结构体参数经常变动,变动时我们又不想修改创建实例的函数。例如:结构体新增一个retry参数,但是又不想在NewConnect入参列表中添加retry int这样的参数声明。

如果结构体参数比较少,可以慎重考虑要不要采用选项模式。

http://www.dtcms.com/a/571514.html

相关文章:

  • 物理机 kali 改造笔记 (一)
  • 线上陪聊服务系统/陪伴平台|陪玩系统源码解析
  • 博野网站建设9个广州seo推广神技
  • 做网站人员有什么名称wordpress登录页
  • 商城html模板郑州seo代理商
  • LNMT部署zrlog个人博客(动静分离高可用集群)
  • 网站logo提交织梦游戏网站源码
  • asp网站收录后换成php网站转向链接 要注意什么网站控制板面
  • 代刷网站搭建教程wordpress文章发布器
  • 绵阳做网站的公司有哪些网络设计与制作课程
  • 做化工哪个网站好wordpress制作主题
  • 四视图网站wordpress 做cms
  • 淘宝客如何做淘宝客网站wordpress设置缓存
  • 聊城做网站公司聊城博达网站建设的三大原则
  • 需要做网站设计开发门户网站
  • 我做网站了 圆通官方网站找oem做洗发水厂家
  • 广东网站建设电话咨询wordpress密码错误
  • 京东的电子商务网站建设汽车网站正在建设中模板
  • 网站网站自己做自己的网站怎么做跳转
  • 慈溪公司做网站xp系统中做网站服务器吗
  • 用dw做网站 主题是哪个个人网站备案地址选择
  • 怎样通过网盘做电影网站wordpress固定连接出错
  • 邓州做网站江门网站推广哪家好
  • 找外包公司做网站做网站需要注册商标多少类
  • 网站推广渠道的类型网站开发的项目开发计划
  • 网站数据库模版国外网站搜索引擎优化方案
  • 用什么网站搭建小说网站旅游电子商务与网站建设
  • 种植类网站模板南阳做网站公司
  • 旺道seo推广系统怎么收费大连网龙建站优化推广
  • 怎么自己做彩票网站吗网站建设hph下载