I think the Builder pattern is easier than this, and it retains the property of 
both ‘config struct’ and ‘multiple args’ versions that the implementation can 
re-order and validate option in aggregate easier - but most of all is doesn’t 
pollute that package with top-level public functions. The builder pattern uses 
instance methods to tie the function to the configuration structure,

> On May 24, 2020, at 11:36 PM, Amarjeet Anand <[email protected]> 
> wrote:
> 
> Thanks James for your response and the amazing posts.
> 
> On Mon, May 25, 2020 at 9:01 AM James <[email protected] 
> <mailto:[email protected]>> wrote:
> This reminds me of functional options which I think are used quite widely for 
> this purpose.
> 
> See https://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis 
> <https://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis> and 
> https://github.com/tmrts/go-patterns/blob/master/idiom/functional-options.md 
> <https://github.com/tmrts/go-patterns/blob/master/idiom/functional-options.md>
> On Mon, 25 May 2020 at 14:57, Amarjeet Anand <[email protected] 
> <mailto:[email protected]>> wrote:
> Is it acceptable to make the optional parameter as varargs?
> I wrote code in my package like ...
> 
> 
> package backoff
> 
> func New(options ...Options) *backOff {
>    backOff := defaultBackOff()
>    if len(options) == 0 {
>       return backOff
>    }
> 
>    // override default values
>    if len(options) > 1 {
>       panic("only 1 backOffOption allowed")
>    }
>    optn := options[0]
>    backOff.options = &optn
> 
>    if optn.Delay_ms > 0 {
>       backOff.delay_ms = optn.Delay_ms
>    }
>    return backOff
> }
> 
> 
> So that in other package, it can be used as backoff.New() when option is not 
> needed(which will be the case most of the time).
> 
> Is using varargs for optional parameter is ok? Or am I abusing the Variadic 
> Functions feature?
> 
> 
> 
> 
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected] 
> <mailto:[email protected]>.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/golang-nuts/CANFuhy8nhhbBDWb0%3D7SLvq1aictC9GVG%3D9zpfpJ1gevDdRmd6A%40mail.gmail.com
>  
> <https://groups.google.com/d/msgid/golang-nuts/CANFuhy8nhhbBDWb0%3D7SLvq1aictC9GVG%3D9zpfpJ1gevDdRmd6A%40mail.gmail.com?utm_medium=email&utm_source=footer>.
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected] 
> <mailto:[email protected]>.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/golang-nuts/CANFuhy9Aj%2Bo7M-%3Dstro5aXbjPTnCZ0y_4vYE3CAjDiBpCUhjpw%40mail.gmail.com
>  
> <https://groups.google.com/d/msgid/golang-nuts/CANFuhy9Aj%2Bo7M-%3Dstro5aXbjPTnCZ0y_4vYE3CAjDiBpCUhjpw%40mail.gmail.com?utm_medium=email&utm_source=footer>.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/67D5D073-044A-4274-9DF4-EE786F08AD65%40ix.netcom.com.

Reply via email to