Canonical guidance

Use when

Avoid

Preferred pattern

type Option func(*Client)

func WithTimeout(d time.Duration) Option {
	return func(c *Client) { c.timeout = d }
}

func NewClient(addr string, opts ...Option) *Client {
	c := &Client{addr: addr, timeout: 5 * time.Second}
	for _, opt := range opts {
		opt(c)
	}
	return c
}

Anti-pattern

Explanation: This anti-pattern is tempting because positional parameters are simple at first, but optional configuration scales poorly once defaults and growth matter.

Why

Related pages

Sources