Golang优雅初始化结构体

本文介绍了一种在Go微服务中使用闭包进行灵活配置的方法,通过示例代码展示了如何利用函数选项模式减少后期扩展时间和提高功能添加的便利性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值