【Golang 实现函数选择模式的变参传参】

golang 变参传参

方法一

package main

import "fmt"

//如何向func传递默认值

type dialOption struct {
	Username string
	Password string
	Service  string
}

type DialOption interface {
	apply(*dialOption)
}


type funcOption struct {
	f func(*dialOption)
}

func(fdo *funcOption) apply(do *dialOption){
	fdo.f(do)
}


func newFuncOption(f func(*dialOption))*funcOption{
	return &funcOption{
		f:f,
	}
}

func withUserName(s string) DialOption{
	return  newFuncOption(func(o *dialOption){
		o.Username = s
	})
}

func withPasswordd(s string) DialOption{
	return  newFuncOption(func(o *dialOption){
		o.Password = s
	})
}

func withService(s string) DialOption{
	return  newFuncOption(func(o *dialOption){
		o.Service = s
	})
}

//默认参数
func defaultOptions() dialOption{
	return dialOption{
		Service:"test",
	}
}

type clientConn struct {
	timeout int
	dopts dialOption
}


func NewClient(address string, opts ...DialOption){
	cc :=&clientConn{
		timeout:30,
		dopts:defaultOptions(),
	}
	//循环调用opts
	for _,opt := range opts {
		opt.apply(&cc.dopts)
	}

	fmt.Printf("76:%+v",cc.dopts)
}


func main(){
	//NewClient("127.0.0.1",withPasswordd("654321"),withService("habox"))
	NewClient("127.0.0.1",withService("habox"))
	//NewClient("127.0.0.1")
}

方法二

package main

import "fmt"

// 可以由用户自定义的参数集合
type Option struct {
	retryNum int
}

// 定义修改默认参数的钩子函数
type ModifyOptFunc func(opt *Option)

// 实际修改默认参数的函数
func WithRetryNum(num int) ModifyOptFunc {
	return func(opt *Option) {
		opt.retryNum = num
	}
}

func OperateRedis(modOptions ...ModifyOptFunc) {
	// 定义参数并添加默认值
	opt := Option{
		retryNum : 10,
	}

	// 调用钩子函数,并对默认值进行修改
	for _,fun := range modOptions {
		fun(&opt)
	}

	// 使用参数做相关实际逻辑
	fmt.Println("current retry number:", opt.retryNum)
}

func main() {
	OperateRedis()
	OperateRedis(WithRetryNum(1))
	OperateRedis(WithRetryNum(200))
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值