如果一个方法中需要传递多个参数且某些参数又是非必传,应该如何处理?
案例
// NewFriend 寻找志同道合朋友 func NewFriend(sex int, age int, hobby string) (string, error) { // 逻辑处理 ... return "", nil }
NewFriend()
,方法中参数 sex
和 age
为非必传参数,这时方法如何怎么写?
传参使用不定参数!
想一想怎么去实现它?
看一下这样写可以吗?
// Sex 性别 type Sex int // Age 年龄 type Age int // NewFriend 寻找志同道合的朋友 func NewFriend(hobby string, args ...interface{}) (string, error) { for _, arg := range args { switch arg.(type) { case Sex: fmt.Println(arg, "is sex") case Age: fmt.Println(arg, "is age") default: fmt.Println("未知的类型") } } return "", nil }
有没有更好的方案呢?
传递结构体... 恩,这也是一个办法。
咱们看看别人的开源代码怎么写的呢,我学习的是 grpc.Dial(target string, opts …DialOption)
方法,它都是通过 WithXX
方法进行传递的参数,例如:
conn, err := grpc.Dial("127.0.0.1:8000", grpc.WithChainStreamInterceptor(), grpc.WithInsecure(), grpc.WithBlock(), grpc.WithDisableRetry(), )
比着葫芦画瓢,我实现的是这样的,大家可以看看:
// Option custom setup config type Option func(*option) // option 参数配置项 type option struct { sex int age int } // NewFriend 寻找志同道合的朋友 func NewFriend(hobby string, opts ...Option) (string, error) { opt := new(option) for _, f := range opts { f(opt) } fmt.Println(opt.sex, "is sex") fmt.Println(opt.age, "is age") return "", nil } // WithSex sex 1=female 2=male func WithSex(sex int) Option { return func(opt *option) { opt.sex = sex } } // WithAge age func WithAge(age int) Option { return func(opt *option) { opt.age = age } }
使用的时候这样调用:
friends, err := friend.NewFriend( "看书", friend.WithAge(30), friend.WithSex(1), ) if err != nil { fmt.Println(friends) }
这样写如果新增其他参数,是不是也很好配置呀。