若是一个方法中须要传递多个参数且某些参数又是非必传,应该如何处理?学习
// NewFriend 寻找志同道合朋友 func NewFriend(sex int, age int, hobby string) (string, error) { // 逻辑处理 ... return "", nil }
NewFriend()
,方法中参数 sex
和 age
为非必传参数,这时方法如何怎么写?code
传参使用不定参数!rpc
想想怎么去实现它?get
看一下这样写能够吗?string
// 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 }
有没有更好的方案呢?it
传递结构体... 恩,这也是一个办法。io
我们看看别人的开源代码怎么写的呢,我学习的是 grpc.Dial(target string, opts …DialOption)
方法,它都是经过 WithXX
方法进行传递的参数,例如:配置
conn, err := grpc.Dial("127.0.0.1:8000", grpc.WithChainStreamInterceptor(), grpc.WithInsecure(), grpc.WithBlock(), grpc.WithDisableRetry(), )
比着葫芦画瓢,我实现的是这样的,你们能够看看:grpc
// 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) }
这样写若是新增其余参数,是否是也很好配置呀。
以上。
对以上有疑问,快来个人星球交流吧 ~ https://t.zsxq.com/iIUVVnA