zap logger 日志记录库 options接口类型 可选参数(函数)使用 总结

zap是go语言中的一个不错的日志记录库, 在我们创建zap.Logger对象的时候,第一个参数就是一个Core, 这个即是这个zap框架的内核,第二个参数options是一个可选参数,他的类型是一个名为Option的接口定义, 这个接口里面就一个方法 apply(*Logger) 参数就是我们要创建的这个Logger指针对象。 如下所示:

options参数的作用和使用方法

从上面可见,我们在创建Logger对象的时候对于这个Logger对象,我们只提供了4个属性, 而实际上这个Logger对象里面的属性可不止4个, 那如果我们要对这些属性进行赋值该怎么办呢?  这时就用上了这个 options参数了, 由于这个参数是一个接口,所以我们只需要传递一个实现了这个接口中定义的方法 apply(*Logger) 的函数给他就可以。 这些个函数zap都定义在了options.go 文件中   我们直接使用即可, 当然也可以自己定义。

这里就以AddCallerSkip 这个Option的使用为例。

这个Option的定义如下

func AddCallerSkip(skip int) Option {
	return optionFunc(func(log *Logger) {
		log.callerSkip += skip
	})
}

可见这个Option 实际上就是帮我们修改了Logger对象中的  callerSkip 这个属性。  因为这个callerSkip 属性是非公开的(首字母小写), 所以我们只能在Logger对象所在的包里面才能访问,外部是访问不了的。

Option使用示例:

logger:=zap.New(nil, AddCallerSkip(1) ) 

注意,这里的第一个参数,我们如果使用默认的Core的话是可以直接nil,zap会自动帮我们创建一个 type nopCore struct{} 类型的Core .  第二个参数就是Option了,这里可以传N个,Option.

接口类型可选参数options应用参考

我们再来看看,在zap里面,他是如何使用这种接口类型的可选参数的。 通过上面的New函数可见,这些options是通过方法 WithOptions来应用的, 下面就是应用代码:

// WithOptions clones the current Logger, applies the supplied Options, and
// returns the resulting Logger. It's safe to use concurrently.
func (log *Logger) WithOptions(opts ...Option) *Logger {
	c := log.clone()
	for _, opt := range opts {
		opt.apply(c)
	}
	return c
}

从上面代码可知,zap首先是克隆了一份Logger对象,然后在for这些opts ,然后 将克隆的这个对象做为apply的参数进行调用, 最后在返回应用了这些方法的 Logger对象。

总结:golang中我们可以使用接口定义来作为函数/方法的参数,这也是多态的一种体现。同时接口我们还能用来在泛型里面对函数的参数进行约束。zap中的options可选参数他实际上就是一个实现了Option接口的函数/方法。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值