所谓优雅,即能够让扩展性更好,便于在后期扩展的时候,减少开发时间,以及更加易于添加功能。具体的实现,就是一次对于闭包的灵活使用(阅go-micro)。
从示例代码main.go、service.go、options.go的实现来说明。
main.go
package main
func main() {
srv := NewService(
Name("golang"),
Age(9),
)
srv.Output()
}
service.go
package main
import "fmt"
type Service interface {
Output()
}
type service struct {
opts *Options
}
func NewService(opts ...Option) Service {
// 对于参数的初始化
options := NewOptions(opts...)
return &service{
opts:options,
}
}
func (p *service) Output(){
fmt.Printf("name:%s age:%d", p.opts.Name, p.opts.Age)
}
options.go
package main
type Option func(*Options)
type Options struct {
Name string
Age int
}
var (
DefaultName = "defaultName"
DefaultAge = 10
)
// 如果没有对指定成员变量初始化,就使用默认参数
func NewOptions(opts ...Option) *Options {
// 初始化默认值
options := &Options{
Name: DefaultName,
Age: DefaultAge,
}
for _, o := range opts {
o(options)
}
return options
}
// 初始化name
func Name(name string) Option {
return func(o *Options) {
o.Name = name
}
}
// 初始化age
func Age(age int) Option {
return func(o *Options) {
o.Age = age
}
}
如果后期需要增加参数,只需要在options中增加一个字段,并且增加一个字段对应的函数即可。不需要类似传统写法再去修改NewOptions的入参以及内部的赋值操作。
具体的使用场景,视情况而定,因为用而用就不好了