如果一个方法中需要传递多个参数且某些参数又是非必传,应该如何处理?
案例
// 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 configtype Option func(*option)// option 参数配置项type option struct {sex intage 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=malefunc WithSex(sex int) Option {return func(opt *option) {opt.sex = sex}}// WithAge agefunc 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)}
这样写如果新增其他参数,是不是也很好配置呀。
以上。
对以上有疑问,快来我的星球交流吧 ~ https://t.zsxq.com/iIUVVnA
