Golang优雅初始化结构体

所谓优雅,即能够让扩展性更好,便于在后期扩展的时候,减少开发时间,以及更加易于添加功能。具体的实现,就是一次对于闭包的灵活使用(阅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的入参以及内部的赋值操作。
具体的使用场景,视情况而定,因为用而用就不好了

你可能感兴趣的:(GO)