{"id":481524,"date":"2026-05-29T08:40:30","date_gmt":"2026-05-29T08:40:30","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=481524"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=481524","title":{"rendered":"Resolvable Config Struct \u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 Functional Options \u0432 Go"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0415\u0441\u043b\u0438 \u0447\u0435\u0441\u0442\u043d\u043e, \u0442\u043e \u043b\u0438\u0447\u043d\u043e \u044f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430\u00bb, \u0430 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 API (\u0433\u0434\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u2014 \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0435).<\/p>\n<p>\u041f\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u0441\u0447\u0451\u0442\u0443, \u043f\u0430\u0442\u0442\u0435\u0440\u043d <strong>Resolvable Config Struct<\/strong> \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0432\u043e\u0434\u0438\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432 \u0442\u0435\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445 <code>Config<\/code> \u0438 <code>Options<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u044b \u0432\u0441\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a-\u0434\u0432\u0430 \u0447\u0430\u0449\u0435, \u0447\u0435\u043c Functional Options. \u0427\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0441\u0435\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u043c\u044b \u0438 \u0442\u0430\u043a \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f, \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0442\u0430\u043c \u0431\u0430\u0440\u0434\u0430\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <em>\u043d\u0435\u043c\u043d\u043e\u0433\u043e<\/em> \u0441\u0442\u0440\u043e\u0433\u043e\u0441\u0442\u0438 \u0447\u0442\u043e\u0431\u044b \u0441\u0442\u0430\u043b\u043e <em>\u043d\u0430\u043c\u043d\u043e\u0433\u043e<\/em> \u043b\u0443\u0447\u0448\u0435.<\/p>\n<p><strong>TL;DR:<\/strong> \u041a\u043e\u0434 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043b\u0443\u0447\u0448\u0435 \u0442\u044b\u0441\u044f\u0447\u0438 \u0441\u043b\u043e\u0432, \u0434\u0430?<\/p>\n<pre><code class=\"go\">\/\/ Enum.type TLSMode uint8const (    TLSDefault TLSMode = iota    TLSEnabled    TLSDisabled    tlsModeCount)func (m TLSMode) Valid() bool { return m &lt; tlsModeCount }\/\/ Sentinel.const NoTimeout time.Duration = -1type Config struct {    \/\/ --- Core fields (no default semantics) ---    AppName          string    Tags             []string    Headers          map[string]string    \/\/ --- Options (has defaults) ---    \/\/ Zero value is not valid and thus means \"use default\".    Host             string        \/\/ \"\" = default    Port             int           \/\/ 0 = default    \/\/ Enum (alternative to *bool which does not enforce Clone requirement).    TLS              TLSMode       \/\/ default\/enabled\/disabled    \/\/ Pointer (all values are valid including zero).    WriteBufferBytes *int          \/\/ nil = default, new(0) = explicit zero    \/\/ Sentinel (zero is a valid value, but not all values are valid).    ReadTimeout      time.Duration \/\/ 0 = default, NoTimeout = disable    \/\/ Separate flag\/enum (alternative to Pointer and Sentinel).    WriteTimeout     time.Duration \/\/ 0 = default    NoWriteTimeout   bool          \/\/ true = disable (ignore WriteTimeout value)}\/\/ Required only if Config contains references.func (c Config) Clone() Config {    c.Tags = slices.Clone(c.Tags)    c.Headers = maps.Clone(c.Headers)    if c.WriteBufferBytes != nil {        c.WriteBufferBytes = new(*c.WriteBufferBytes)    }    return c}\/\/ Required! Idempotent.func (c Config) Resolve() (Config, error) {    c = c.Clone()    \/\/ Defaults.    if c.Host == \"\" {        c.Host = \"localhost\"    }    if c.Port == 0 {        c.Port = 1234    }    if c.TLS == TLSDefault {        c.TLS = TLSEnabled    }    if c.WriteBufferBytes == nil {        c.WriteBufferBytes = new(4096)    }    \/\/ Normalize.    c.AppName = strings.TrimSpace(c.AppName)    \/\/ Validate.    var err error    if c.AppName == \"\" {        err = errors.Join(err, ErrNoAppName)    }    if !c.TLS.Valid() {        err = errors.Join(err, ErrInvalidTLSMode)    }    if c.ReadTimeout &lt; NoTimeout {        err = errors.Join(err, ErrInvalidReadTimeout)    }    if c.NoWriteTimeout &amp;&amp; c.WriteTimeout != 0 {        err = errors.Join(err, ErrConflictingWriteTimeout)    }    return c, err}func NewClient(cfg Config) (*Client, error) {    cfg, err := cfg.Resolve()    if err != nil {        return nil, err    }    return &amp;Client{cfg: cfg}, nil}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f<\/h3>\n<p>\u0412 Go \u0435\u0441\u0442\u044c \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u043e\u0442\u0432\u0435\u0442\u043e\u043c \u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u00ab\u0443 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043e\u043f\u0446\u0438\u0439\u00bb. \u042d\u0442\u043e Functional Options.<\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a: \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u044e\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u0438\u0445 \u043d\u0430 <code>WithX(...)<\/code>, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432, \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0436\u0438\u0432\u0451\u043c \u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u043e.<\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u0434\u0435 Functional Options \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u044e\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u041d\u0435 \u0438\u043d\u043e\u0433\u0434\u0430, \u043d\u0435 \u00ab\u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0445\u00bb, \u0430 <em>\u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430<\/em>. \u0418 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code>Config<\/code> \u0438 <code>Options<\/code> \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0447\u0430\u0449\u0435, \u0447\u0435\u043c Functional Options.<\/p>\n<p>Functional Options \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0431\u0435\u0437\u0443\u043c\u043d\u044b\u0439 \u043e\u0431\u044a\u0451\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0423 \u043d\u0438\u0445 \u043f\u043b\u043e\u0445\u0430\u044f discoverability \u2014 \u0441\u043b\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043e\u043f\u0446\u0438\u0439. \u0418\u0445 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c. \u0418\u0445 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438. \u0418\u0445 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435. \u0418\u0445 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043b\u043e\u044f\u043c\u0438. \u0418\u0445 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0437 \u0444\u0430\u0439\u043b\u0430. \u0418\u0445 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043a\u0430\u043a \u0438\u0442\u043e\u0433\u043e\u0432\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e. \u0418\u0445\u2026 \u0438\u043b\u0438 \u044f \u0443\u0436\u0435 \u043f\u0440\u0438\u0434\u0438\u0440\u0430\u044e\u0441\u044c? \u041b\u0430\u0434\u043d\u043e, \u0445\u0432\u0430\u0442\u0438\u0442 \u0442\u0430\u043a \u0445\u0432\u0430\u0442\u0438\u0442, \u043d\u043e \u0435\u0441\u043b\u0438 \u0447\u0442\u043e &#8212; \u044f \u043c\u043e\u0433\u0443 \u0435\u0449\u0451.<\/p>\n<p>\u0411\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c Functional Options \u043e\u043d\u0438 \u0440\u0435\u0448\u0430\u043b\u0438 \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041d\u043e \u0435\u0441\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441 Resolvable Config Struct \u0443 Functional Options \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u044e\u0441: \u043e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043e\u043f\u0446\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>WithRetry(backoff, attempts, jitter)<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u041d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u044d\u0442\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0442\u0438\u043f\u0430, \u0447\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u043e \u0438 \u0440\u0435\u0434\u043a\u043e \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u043e. \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e \u0438 \u043d\u0435 \u0442\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u0442\u044c \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0437\u0434\u0435\u0440\u0436\u043a\u0438.<\/p>\n<p>\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432 Go \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0438 \u0447\u0430\u0449\u0435 \u043f\u043e\u0431\u0435\u0436\u0434\u0430\u044e\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 <code>Config<\/code>-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041f\u0440\u043e\u0441\u0442\u043e \u043e\u043d\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0445\u0430\u043e\u0442\u0438\u0447\u043d\u043e. \u0413\u0434\u0435-\u0442\u043e \u0435\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0433\u0434\u0435-\u0442\u043e \u043d\u0435\u0442\u2026 \u0413\u0434\u0435-\u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0433\u0434\u0435-\u0442\u043e \u043d\u0435\u0442\u2026 \u0413\u0434\u0435-\u0442\u043e \u0441\u0441\u044b\u043b\u043e\u0447\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0433\u0434\u0435-\u0442\u043e \u043d\u0435\u0442\u2026 \u0413\u0434\u0435-\u0442\u043e <code>0<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u00ab\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\u00bb, \u0430 \u0433\u0434\u0435-\u0442\u043e \u2014 \u00ab\u044f\u0432\u043d\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043e\u00bb. \u041f\u043b\u044e\u0441 \u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0435\u043b\u043a\u0438\u0445 \u043e\u0442\u043b\u0438\u0447\u0438\u0439, \u043d\u043e, \u0434\u0443\u043c\u0430\u044e, \u0432\u044b \u0432\u0441\u0435 \u0443\u0436\u0435 \u0443\u0437\u043d\u0430\u043b\u0438 \u0441\u0432\u043e\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u044b.<\/p>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0445\u0430\u043e\u0441\u0430 \u0438 \u0432\u044b\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043d\u0430\u0437\u044b\u0432\u0430\u044e <strong>Resolvable Config Struct<\/strong>.<\/p>\n<p>\u042d\u0442\u043e \u043d\u0435 \u00ab\u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441 \u043f\u043e\u043b\u044f\u043c\u0438\u00bb, \u0430 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0439, \u0443\u0436\u0435 \u0434\u043e\u043c\u0438\u043d\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432 Go \u0441\u0442\u0438\u043b\u044c \u043a \u0435\u0434\u0438\u043d\u043e\u043c\u0443 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0443 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Resolvable Config Struct<\/h3>\n<p>Resolvable Config Struct \u2014 \u044d\u0442\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c:<\/p>\n<ul>\n<li>\n<p>\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u00ab\u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u043e \u2192 \u0432\u0437\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\u00bb \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043a\u0430\u043a \u043f\u043e\u043b\u044f \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 <code>Config<\/code> \u0438\u043b\u0438 <code>Options<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u043b\u044f <strong>\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e zero \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u043b\u043e \u00ab\u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u043e \u2192 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c default\u00bb<\/strong>; \u0435\u0441\u043b\u0438 zero \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043f\u043e\u043b\u0435 \u043f\u0435\u0440\u0435\u043e\u0444\u043e\u0440\u043c\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u044e\u0431\u044b\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0449\u0438\u043c \u044d\u0442\u0443 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c (\u043d\u0430\u043f\u0440. \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, sentinel value, enum \u0438\u043b\u0438 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435-\u0444\u043b\u0430\u0433);<\/p>\n<\/li>\n<li>\n<p>\u0435\u0441\u043b\u0438 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043e\u0447\u043d\u044b\u0435 \u043f\u043e\u043b\u044f, \u043e\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 <code>Clone()<\/code> (deep copy);<\/p>\n<\/li>\n<li>\n<p>\u043f\u0435\u0440\u0435\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u044b\u0439 <code>Resolve()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u0442, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0438 \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u044d\u0442\u043e \u043f\u043e\u043b\u043d\u044b\u0439 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438: \u0441\u044b\u0440\u043e\u0439 <code>Config<\/code> \u2192 <code>Clone()<\/code> \u2192 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u2192 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u2192 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u2192 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 <code>Config<\/code>.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 <code>Resolve()<\/code> \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0434\u0435\u0442\u0430\u043b\u044c\u044e, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u043e\u0439 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432, \u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u043e \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430. \u0418\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u0437 \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u043f\u043e\u043b\u0435\u0439 \u0432 \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u043e \u0436\u0438\u0442\u044c.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 &#8212; \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442. \u041c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c <code>NewClient(appName string, cfg Config)<\/code>. \u041e\u043d \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.<\/p>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 Functional Options \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0445\u0443\u0436\u0435<\/h3>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e Functional Options \u0437\u0430\u0449\u0438\u0449\u0430\u044e\u0442 \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 \u00ab\u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u00bb. \u041d\u043e \u0435\u0441\u043b\u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0435 \u043d\u0430 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u0430, \u0430 \u043d\u0430 \u0432\u0435\u0441\u044c \u0441\u0440\u043e\u043a \u0436\u0438\u0437\u043d\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0440\u0435\u0437\u043a\u043e \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f.<\/p>\n<h4>1. \u042d\u0442\u043e \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 \u043e\u0431\u044a\u0451\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430<\/h4>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043e\u043f\u0446\u0438\u0438 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u0427\u0430\u0441\u0442\u043e \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f. \u0418\u043d\u043e\u0433\u0434\u0430 \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.<\/p>\n<pre><code class=\"go\">type Option func(*Config)func WithHost(host string) Option {    return func(c *Config) { c.Host = host }}func WithPort(port int) Option {    return func(c *Config) { c.Port = port }}func WithTLS(mode TLSMode) Option {    return func(c *Config) { c.TLS = mode }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u0442\u0440\u0438 \u043f\u043e\u043b\u044f \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0435\u0440\u043f\u0438\u043c\u043e. \u041d\u0430 \u0434\u0435\u0441\u044f\u0442\u044c \u2014 \u0443\u0436\u0435 \u0440\u0430\u0437\u0434\u0440\u0430\u0436\u0430\u0435\u0442. \u0415\u0441\u043b\u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u0434\u0435\u043b\u0430\u044e\u0442 \u0441\u0430\u043c\u0438 \u043e\u043f\u0446\u0438\u0438 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 error &#8212; \u043a\u043e\u0434 \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0441\u0438\u043b\u044c\u043d\u0435\u0435.<\/p>\n<p>\u0421\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u0439 API \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"go\">type Config struct {    Host string    Port int    TLS  TLSMode}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>2. \u0423 \u043d\u0438\u0445 \u043f\u043b\u043e\u0445\u0430\u044f discoverability<\/h4>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0432\u0438\u0436\u0443 <code>Config<\/code>, \u044f \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0436\u0443 \u0432\u0435\u0441\u044c \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0438\u0445 \u0442\u0438\u043f\u044b, \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0438, \u0438 \u043d\u0435\u0440\u0435\u0434\u043a\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043f\u0440\u043e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0432\u0438\u0436\u0443 Functional Options, \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u0432\u0441\u0435 <code>WithX<\/code> \u043f\u043e \u043f\u0430\u043a\u0435\u0442\u0443, \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c API \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u0442\u043e\u0447\u043a\u0430\u043c, \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a\u0438\u0435 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043a \u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0443, \u0430 \u043a\u0430\u043a\u0438\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443.<\/p>\n<p>\u042d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u0430\u0445, \u0433\u0434\u0435 <code>WithTimeout<\/code> \u0438\u043b\u0438 <code>WithLogger<\/code> \u043c\u043e\u0433\u0443\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445.<\/p>\n<h4>3. \u0418\u0445 \u043d\u0435 \u0442\u0430\u043a \u0443\u0434\u043e\u0431\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u043e<\/h4>\n<p>\u041e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u044b\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439: \u0447\u0430\u0441\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445.<\/p>\n<p>\u0421\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e:<\/p>\n<pre><code class=\"go\">cfg := Config{AppName: \"billing\"}if debug {    cfg.TLS = TLSDisabled}if writeBuf &gt; 0 {    cfg.WriteBufferBytes = new(writeBuf)}client, err := NewClient(cfg)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421 \u0442\u0435\u0440\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u043c \u0435\u0449\u0451 \u043b\u0443\u0447\u0448\u0435:<\/p>\n<pre><code class=\"go\">client, err := NewClient(Config{    AppName:          \"billing\",    TLS:              lo.Ternary(debug, TLSDisabled, TLSDefault),    WriteBufferBytes: lo.Ternary(writeBuf &gt; 0, new(writeBuf), nil),})<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421 Functional Options \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u0435 \u0441\u0440\u0435\u0437\u0430:<\/p>\n<pre><code class=\"go\">opts := []Option{}if debug {    opts = append(opts, WithTLS(TLSDisabled))}if writeBuf &gt; 0 {    opts = append(opts, WithWriteBufferBytes(writeBuf))}client, err := NewClient(\"billing\", opts...)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0424\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. \u041d\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0437\u0434\u0435\u0441\u044c \u0447\u0430\u0449\u0435 \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u0442\u0435\u043c, \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430.<\/p>\n<h4>4. \u0418\u0445 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c <code>Config<\/code>, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0435\u0433\u043e \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c, \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c, \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c, \u0438\u043b\u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043a\u0430\u043a \u00ab\u0438\u0442\u043e\u0433\u043e\u0432\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\u00bb.<\/p>\n<p>\u0421 Functional Options \u0432\u044b \u0432 \u043b\u0443\u0447\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0438\u0434\u0438\u0442\u0435 \u043d\u0430\u0431\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0439-\u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439. \u0422\u043e \u0435\u0441\u0442\u044c \u0442\u0435\u0440\u044f\u0435\u0442\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>\u0414\u0430, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0432\u044b \u043f\u043e\u0447\u0442\u0438 \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0435 \u044d\u0442\u0438 \u043e\u043f\u0446\u0438\u0438 \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 <code>Config<\/code>. \u041d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0441\u043e\u043c\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c: \u043e\u043d \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u0430 \u043f\u043e\u0442\u043e\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<h4>5. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043b\u0443\u0447\u0448\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/h4>\n<p>\u041e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0438\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u043e\u0440\u043e\u043d \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0432 Go \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u00ab\u0438\u043c\u044f \u043f\u043e\u043b\u044f \u2192 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u00bb.<\/p>\n<pre><code class=\"go\">client, err := NewClient(\"billing\", Config{    Host:             \"localhost\",    Port:             8443,    TLS:              TLSEnabled,    WriteBufferBytes: new(0),})<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u0443\u0434\u043e\u0431\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c, \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0432 \u0440\u0435\u0432\u044c\u044e.<\/p>\n<p>\u0421 Functional Options \u0437\u0430\u043f\u0438\u0441\u044c \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u043a\u043e\u0440\u043e\u0447\u0435, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0443\u0436\u0435 \u043d\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043e\u0434\u043d\u043e \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"go\">client, err := NewClient(    \"billing\",    WithHost(\"localhost\"),    WithPort(8443),    WithTLS(TLSEnabled),    WithWriteBufferBytes(0),)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0412 \u0447\u0451\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438<\/h3>\n<p>\u041e\u0431\u044b\u0447\u043d\u044b\u0435 <code>Config<\/code>-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0432 Go \u043d\u0430 \u043f\u0430\u0440\u0443 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0435\u0435 Functional Options. \u041f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u043d\u0438 \u043f\u0440\u043e\u0449\u0435, \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u0435\u0435, \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435, \u0438 \u043b\u0443\u0447\u0448\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0440\u0438\u0440\u043e\u0434\u0435 \u044f\u0437\u044b\u043a\u0430.<\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0432\u0435\u0437\u0434\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443.<\/p>\n<p>\u041e\u0434\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442, \u0447\u0442\u043e <code>0<\/code> \u0437\u043d\u0430\u0447\u0438\u0442 \u00ab\u0432\u043e\u0437\u044c\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\u00bb. \u0414\u0440\u0443\u0433\u0430\u044f \u2014 \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0435 \u044f\u0432\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0413\u0434\u0435-\u0442\u043e \u0441\u0441\u044b\u043b\u043e\u0447\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f. \u0413\u0434\u0435-\u0442\u043e \u2014 \u043d\u0435\u0442. \u0413\u0434\u0435-\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430. \u0413\u0434\u0435-\u0442\u043e \u2014 \u0440\u0443\u043a\u0430\u043c\u0438 \u0437\u0430\u0440\u0430\u043d\u0435\u0435. \u0413\u0434\u0435-\u0442\u043e \u0435\u0441\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f. \u0413\u0434\u0435-\u0442\u043e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043f\u043e\u043c\u043d\u0438\u0442, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c.<\/p>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d Resolvable Config Struct \u0438 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c. \u041d\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b, \u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u044b\u0439 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431.<\/p>\n<h3>\u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0438\u0434\u0435\u044f: \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u2014 \u044d\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u2014 \u044d\u0442\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0447\u0442\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430.<\/p>\n<p>\u041e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430:<\/p>\n<ul>\n<li>\n<p>\u0431\u044b\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c\u0430 \u0432 \u0432\u0438\u0434\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>\u0431\u044b\u0442\u044c \u043f\u0440\u0438\u0433\u043e\u0434\u043d\u043e\u0439 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0438\u043c\u0435\u0442\u044c \u044f\u0432\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439;<\/p>\n<\/li>\n<li>\n<p>\u0438\u043c\u0435\u0442\u044c \u044f\u0432\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043a \u0440\u0430\u0431\u043e\u0447\u0435\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u0434\u0435\u043b\u0438\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043a\u043e\u0434\u043e\u043c \u043f\u043e \u043e\u0448\u0438\u0431\u043a\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"go\">type Config struct {    Host string    Port int}func (c Config) Resolve() (Config, error) {    if c.Host == \"\" {        c.Host = \"localhost\"    }    if c.Port == 0 {        c.Port = 8080    }    return c, nil}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u043a\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0445 \u043d\u0443\u043b\u0435\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.<\/p>\n<p>\u041d\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c API \u043f\u043e\u0447\u0442\u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438.<\/p>\n<h3>\u041a\u0430\u043a \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u043e\u00bb<\/h3>\n<p>\u0412 Go \u043d\u0435\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e <code>Option[T]<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u00ab\u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u043e\u00bb \u0438 \u00ab\u0437\u0430\u0434\u0430\u043d\u043e \u044f\u0432\u043d\u043e\u00bb \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<\/p>\n<p>\u041f\u043b\u044e\u0441 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u044f\u0432\u043d\u043e, \u0430 \u043d\u0435 \u0440\u0430\u0437\u043c\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u0443 <code>WithX<\/code>.<\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432.<\/p>\n<h4>\u041e\u0431\u044b\u0447\u043d\u043e\u0435 \u043f\u043e\u043b\u0435<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0443\u043b\u0435\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a \u044f\u0432\u043d\u043e\u0435, \u0442\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043f\u0440\u044f\u043c\u043e:<\/p>\n<pre><code class=\"go\">type Config struct {    Host string \/\/ \"\" = \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e    Port int    \/\/ 0 = \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0430\u043b\u0438\u0434\u043d\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043d\u043e\u043b\u044c, \u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u0436\u0435 \u0432\u0430\u0436\u043d\u043e, \u0442\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c:<\/p>\n<pre><code class=\"go\">type Config struct {    WriteBufferBytes *int \/\/ nil = \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, new(0) = \u044f\u0432\u043d\u044b\u0439 \u043d\u043e\u043b\u044c}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>Sentinel<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0442\u0438\u043f\u0430 \u0435\u0441\u0442\u044c \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043e\u0434\u043d\u043e \u0438\u0437 \u043d\u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043d\u044f\u0442\u044c \u043f\u043e\u0434 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c:<\/p>\n<pre><code class=\"go\">const NoTimeout time.Duration = -1type Config struct {    ReadTimeout time.Duration \/\/ 0 = \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, NoTimeout = \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0424\u043b\u0430\u0433 \u0438\u043b\u0438 enum<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0435 \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442 \u0440\u0435\u0436\u0438\u043c, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0438\u0441\u043b\u043e, \u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u0442\u043e \u0432 \u044f\u0432\u043d\u044b\u0439 \u0442\u0438\u043f:<\/p>\n<pre><code class=\"go\">type TLSMode uint8const (    TLSDefault TLSMode = iota    TLSEnabled    TLSDisabled)type Config struct {    TLS TLSMode}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u043b\u0438 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"go\">type Config struct {    WriteTimeout   time.Duration \/\/ 0 = \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e    NoWriteTimeout bool          \/\/ true = \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>Clone() \u2014 \u043d\u0435 boilerplate, \u0430 \u0448\u0442\u0430\u0442\u043d\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u044f\u0437\u044b\u043a\u0430\u2026<\/h3>\n<p>\u2026\u0445\u043e\u0442\u044f \u0438 \u043a\u0440\u0438\u0432\u043e\u0439, \u043d\u043e \u0442\u0443\u0442 \u0443\u0436 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u0434\u0435\u043b\u0430\u0435\u0448\u044c.<\/p>\n<p>\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043e\u0447\u043d\u044b\u0435 \u043f\u043e\u043b\u044f, \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441 \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0441 \u0442\u0430\u043a\u0438\u043c <code>Config<\/code>:<\/p>\n<pre><code class=\"go\">type Config struct {    Tags             []string    Headers          map[string]string    WriteBufferBytes *int}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u043f\u043e\u0442\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u0442 <code>Tags<\/code>, <code>Headers<\/code> \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 <code>WriteBufferBytes<\/code>?<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0438, \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u043c \u0441\u043d\u0430\u0440\u0443\u0436\u0438. \u0414\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u044d\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0430.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u0437\u0434\u0435\u0441\u044c \u0436\u0451\u0441\u0442\u043a\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e: \u0435\u0441\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0441\u044b\u043b\u043e\u0447\u043d\u044b\u0435 \u043f\u043e\u043b\u044f, \u0442\u043e \u043e\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 <code>Clone()<\/code> (deep copy).<\/p>\n<p>\u0412 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c Go \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e:<\/p>\n<pre><code class=\"go\">func (c Config) Clone() Config {    c.Tags = slices.Clone(c.Tags)    c.Headers = maps.Clone(c.Headers)    if c.WriteBufferBytes != nil {        c.WriteBufferBytes = new(*c.WriteBufferBytes)    }    return c}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>Resolve() \u2014 \u0441\u0435\u0440\u0434\u0446\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430<\/h3>\n<p>\u0411\u0435\u0437 <code>Resolve()<\/code> \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0431\u043e\u0440 \u043f\u043e\u043b\u0435\u0439, \u0432\u043e\u043a\u0440\u0443\u0433 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0441\u0435 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0451\u043d\u043d\u043e\u0441\u0442\u0438 \u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b.<\/p>\n<p>\u0421 <code>Resolve()<\/code> \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0451 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043a \u0440\u0430\u0431\u043e\u0447\u0435\u043c\u0443 \u0432\u0438\u0434\u0443:<\/p>\n<ul>\n<li>\n<p>\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u0447\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e;<\/p>\n<\/li>\n<li>\n<p>\u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u043a\u0430\u043a \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434<\/h3>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435 \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u043e Resolvable Config Struct, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043d\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u0443\u044e \u0442\u0435\u0445\u043d\u0438\u043a\u0443. \u0415\u0433\u043e \u0441\u0438\u043b\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c: \u043e\u043d \u0431\u0435\u0440\u0451\u0442 \u0443\u0436\u0435 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439, \u0441\u0430\u043c\u044b\u0439 \u043c\u0430\u0441\u0441\u043e\u0432\u044b\u0439, \u0441\u0430\u043c\u044b\u0439 \u0434\u0435\u0448\u0451\u0432\u044b\u0439 \u0434\u043b\u044f Go \u0441\u0442\u0438\u043b\u044c \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a \u043d\u0435\u043c\u0443 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u043e\u0433\u043e\u0441\u0442\u044c.<\/p>\n<p>\u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u043e\u0439 API \u043f\u043e\u0432\u0435\u0440\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043b\u043e\u0434\u0438\u0442\u044c \u0434\u0435\u0441\u044f\u0442\u043a\u0438 <code>WithX<\/code>. \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u044f\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044f. \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u00ab\u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u00bb \u0438 \u00ab\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u00bb.<\/p>\n<p>\u041d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0436\u0438\u0432\u0443\u0442 \u0432 <code>Config<\/code>;<\/p>\n<\/li>\n<li>\n<p>zero-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043d\u0438\u0445 \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u201c\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\u201d;<\/p>\n<\/li>\n<li>\n<p>\u0441\u0441\u044b\u043b\u043e\u0447\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 <code>Clone()<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>Resolve()<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u043d\u0438\u0436\u0435 \u043f\u043e \u0441\u0442\u0435\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0443\u0436\u0435 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c <code>Resolve()<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442, \u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0445\u0430\u043e\u0441.<\/p>\n<h3>\u0412\u044b\u0432\u043e\u0434<\/h3>\n<p>\u0423 Functional Options \u0431\u044b\u043b\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430.<\/p>\n<p>\u0420\u043e\u0431 \u041f\u0430\u0439\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043b <a href=\"https:\/\/commandcenter.blogspot.com\/2014\/01\/self-referential-functions-and-design.html\" rel=\"noopener noreferrer nofollow\">\u043a\u0440\u0430\u0441\u0438\u0432\u0443\u044e \u0442\u0435\u0445\u043d\u0438\u043a\u0443 \u0441\u0430\u043c\u043e\u0441\u0441\u044b\u043b\u043e\u0447\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u043a\u0430\u0442\u0430<\/a>. \u042d\u0442\u043e \u0438\u0437\u044f\u0449\u043d\u044b\u0439 \u043f\u0440\u0438\u0451\u043c, \u043d\u043e \u043e\u043d \u0432\u043e\u043e\u0431\u0449\u0435-\u0442\u043e \u043d\u0435 \u043f\u0440\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u043a\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u044b\u0435, \u0430 \u043f\u0440\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438.<\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0414\u0435\u0439\u0432 \u0427\u0435\u0439\u043d\u0438 \u0443\u0436\u0435 <a href=\"https:\/\/dave.cheney.net\/2014\/10\/17\/functional-options-for-friendly-apis\" rel=\"noopener noreferrer nofollow\">\u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e API \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432<\/a>, \u0438 \u0435\u0433\u043e \u043f\u0440\u0435\u0442\u0435\u043d\u0437\u0438\u0438 \u0431\u044b\u043b\u0438 \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u044b. \u0414\u043b\u0438\u043d\u043d\u044b\u0435 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u044b. \u0417\u043e\u043e\u043f\u0430\u0440\u043a <code>NewXxxWithYyy<\/code> \u043d\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 <code>Config{}<\/code> \u0438\u043b\u0438 <code>nil<\/code> \u0440\u0430\u0434\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u043b\u043e\u0445\u043e. <code>0<\/code> \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u0447\u0430\u0441\u0442\u043e \u0434\u0432\u0443\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u0435\u043d. <code>*Config<\/code> \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0440\u0438\u0441\u043a \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u0412\u0441\u0435 \u044d\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u044b.<\/p>\n<p>\u041d\u043e Functional Options \u0440\u0435\u0448\u0430\u044e\u0442 \u0438\u0445 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043d\u0430 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 API. \u041e\u043d\u0438 \u0443\u0431\u0438\u0440\u0430\u044e\u0442 \u0434\u043b\u0438\u043d\u043d\u0443\u044e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0440\u0430\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0431\u0435\u0437 \u0435\u0451 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0446\u0435\u043d\u043e\u0439 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0451\u0442 \u0431\u044b\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u0431\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0439.<\/p>\n<p>Resolvable Config Struct \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0440\u0435\u0448\u0438\u0442\u044c \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u2014 \u0432 \u0441\u0430\u043c\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u0438\u0441\u0430\u0442\u044c <code>Config{}<\/code> \u0440\u0430\u0434\u0438 \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0442\u043e \u044d\u0442\u043e \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0434\u0438\u0437\u0430\u0439\u043d\u043e\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c nil \u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code>NewClient()<\/code> \u0440\u044f\u0434\u043e\u043c \u0441 <code>NewClientWithConfig(cfg Config)<\/code>), \u0430 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u043c \u043a <code>WithX(...)<\/code>. \u0415\u0441\u043b\u0438 <code>0<\/code> \u0434\u0432\u0443\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u0435\u043d, \u0442\u043e \u044d\u0442\u043e \u043d\u0430\u0434\u043e \u0447\u0438\u043d\u0438\u0442\u044c \u044f\u0432\u043d\u044b\u043c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u00ab\u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u043e\u00bb \u0447\u0435\u0440\u0435\u0437 zero-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0430\u0446\u0438\u0438 \u201c\u0441\u044a\u0435\u0434\u0435\u043d\u043d\u043e\u0433\u043e\u201d zero-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u043e \u043d\u0443\u0436\u043d\u043e (\u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, sentinel, enum \u0438\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u043b\u0430\u0433). \u0415\u0441\u043b\u0438 <code>*Config<\/code> \u043e\u043f\u0430\u0441\u0435\u043d \u0438\u0437-\u0437\u0430 shared state, \u0442\u043e \u044d\u0442\u043e \u0447\u0438\u043d\u0438\u0442\u0441\u044f <code>Clone()<\/code>. \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0430\u0437\u043c\u0430\u0437\u0430\u043d\u044b \u043f\u043e \u043a\u043e\u0434\u0443, \u0442\u043e \u044d\u0442\u043e \u0447\u0438\u043d\u0438\u0442\u0441\u044f <code>Resolve()<\/code>.<\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u0431\u0435\u0449\u0430\u043d\u0438\u0435 \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e API: \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u0431\u0435\u0437 \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u043d\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b, \u0430 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u043c. \u041d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0442\u0435\u0440\u044f\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435. \u0415\u0451 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438, \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0432 \u0442\u0435\u0441\u0442\u0435, \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043b\u043e\u044f\u043c\u0438, \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043a\u0430\u043a \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 <code>Resolve()<\/code>.<\/p>\n<p>\u041c\u043e\u0439 \u043f\u043e\u0438\u043d\u0442 \u043d\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e Functional Options \u0431\u044b\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u043e\u0439. \u0421\u043a\u043e\u0440\u0435\u0435 \u044d\u0442\u043e \u0431\u044b\u043b \u0440\u0430\u0437\u0443\u043c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u043f\u043b\u043e\u0445\u0438\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0438 \u043d\u0430\u0438\u0432\u043d\u044b\u0435 <code>Config<\/code>-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043e\u0431\u0440\u0430\u0437\u0446\u0430 \u00ab\u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u043c \u0432\u0441\u0451 \u0432 \u043f\u043e\u043b\u044f \u0438 \u043a\u0430\u043a-\u043d\u0438\u0431\u0443\u0434\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f\u00bb. \u041d\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0435\u0441\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0448\u0435, \u0438 \u0435\u0433\u043e \u0441\u0442\u043e\u0438\u0442 \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c <code>Config<\/code>, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e:<\/p>\n<ul>\n<li>\n<p>\u044f\u0432\u043d\u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u043e\u00bb \u0432 zero-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445;<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043e\u0447\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u0432 <code>Clone()<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0441\u0432\u0435\u0441\u0442\u0438 Clone, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u0432 <code>Resolve()<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u201c\u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441 \u0442\u044c\u043c\u043e\u0439 \u043f\u043e\u043b\u0435\u0439\u201d, \u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439, \u0446\u0435\u043b\u044c\u043d\u044b\u0439, \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432.<\/p>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e \u044f \u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c <strong>Resolvable Config Struct<\/strong>.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1040882\/\">https:\/\/habr.com\/ru\/articles\/1040882\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0415\u0441\u043b\u0438 \u0447\u0435\u0441\u0442\u043d\u043e, \u0442\u043e \u043b\u0438\u0447\u043d\u043e \u044f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430\u00bb, \u0430 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 API (\u0433\u0434\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u2014 \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0435).\u041f\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u0441\u0447\u0451\u0442\u0443, \u043f\u0430\u0442\u0442\u0435\u0440\u043d Resolvable Config Struct \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0432\u043e\u0434\u0438\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432 \u0442\u0435\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445 Config \u0438 Options, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u044b \u0432\u0441\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a-\u0434\u0432\u0430 \u0447\u0430\u0449\u0435, \u0447\u0435\u043c Functional Options. \u0427\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0441\u0435\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 \u043c\u044b \u0438 \u0442\u0430\u043a \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f, \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0442\u0430\u043c \u0431\u0430\u0440\u0434\u0430\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0440\u043e\u0433\u043e\u0441\u0442\u0438 \u0447\u0442\u043e\u0431\u044b \u0441\u0442\u0430\u043b\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043b\u0443\u0447\u0448\u0435.TL;DR: \u041a\u043e\u0434 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043b\u0443\u0447\u0448\u0435 \u0442\u044b\u0441\u044f\u0447\u0438 \u0441\u043b\u043e\u0432, \u0434\u0430?\/\/ Enum.type TLSMode uint8const (    TLSDefault TLSMode = iota    TLSEnabled    TLSDisabled    tlsModeCount)func (m TLSMode) Valid() bool { return m &lt; tlsModeCount }\/\/ Sentinel.const NoTimeout time.Duration = -1type Config struct {    \/\/ &#8212; Core fields (no default semantics) &#8212;    AppName          string    Tags             []string    Headers          map[string]string    \/\/ &#8212; Options (has defaults) &#8212;    \/\/ Zero value is not valid and thus means &#171;use default&#187;.    Host             string        \/\/ &#171;&#187; = default    Port             int           \/\/ 0 = default    \/\/ Enum (alternative to *bool which does not enforce Clone requirement).    TLS              TLSMode       \/\/ default\/enabled\/disabled    \/\/ Pointer (all values are valid including zero).    WriteBufferBytes *int          \/\/ nil = default, new(0) = explicit zero    \/\/ Sentinel (zero is a valid value, but not all values are valid).    ReadTimeout      time.Duration \/\/ 0 = default, NoTimeout = disable    \/\/ Separate flag\/enum (alternative to Pointer and Sentinel).    WriteTimeout     time.Duration \/\/ 0 = default    NoWriteTimeout   bool          \/\/ true = disable (ignore WriteTimeout value)}\/\/ Required only if Config contains references.func (c Config) Clone() Config {    c.Tags = slices.Clone(c.Tags)    c.Headers = maps.Clone(c.Headers)    if c.WriteBufferBytes != nil {        c.WriteBufferBytes = new(*c.WriteBufferBytes)    }    return c}\/\/ Required! Idempotent.func (c Config) Resolve() (Config, error) {    c = c.Clone()    \/\/ Defaults.    if c.Host == &#171;&#187; {        c.Host = &#171;localhost&#187;    }    if c.Port == 0 {        c.Port = 1234    }    if c.TLS == TLSDefault {        c.TLS = TLSEnabled    }    if c.WriteBufferBytes == nil {        c.WriteBufferBytes = new(4096)    }    \/\/ Normalize.    c.AppName = strings.TrimSpace(c.AppName)    \/\/ Validate.    var err error    if c.AppName == &#171;&#187; {        err = errors.Join(err, ErrNoAppName)    }    if !c.TLS.Valid() {        err = errors.Join(err, ErrInvalidTLSMode)    }    if c.ReadTimeout &lt; NoTimeout {        err = errors.Join(err, ErrInvalidReadTimeout)    }    if c.NoWriteTimeout &amp;&amp; c.WriteTimeout != 0 {        err = errors.Join(err, ErrConflictingWriteTimeout)    }    return c, err}func NewClient(cfg Config) (*Client, error) {    cfg, err := cfg.Resolve()    if err != nil {        return nil, err    }    return &amp;Client{cfg: cfg}, nil}\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f\u0412 Go \u0435\u0441\u0442\u044c \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u043e\u0442\u0432\u0435\u0442\u043e\u043c \u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u00ab\u0443 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043e\u043f\u0446\u0438\u0439\u00bb. \u042d\u0442\u043e Functional Options.\u041e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a: \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u044e\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u0438\u0445 \u043d\u0430 WithX(&#8230;), \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432, \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0436\u0438\u0432\u0451\u043c \u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u043e.\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u0434\u0435 Functional Options \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u044e\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u041d\u0435 \u0438\u043d\u043e\u0433\u0434\u0430, \u043d\u0435 \u00ab\u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0445\u00bb, \u0430 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430. \u0418 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b Config \u0438 Options \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0447\u0430\u0449\u0435, \u0447\u0435\u043c Functional Options.Functional Options \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0431\u0435\u0437\u0443\u043c\u043d\u044b\u0439 \u043e\u0431\u044a\u0451\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0423 \u043d\u0438\u0445 \u043f\u043b\u043e\u0445\u0430\u044f discoverability \u2014 \u0441\u043b\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043e\u043f\u0446\u0438\u0439. \u0418\u0445 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c. \u0418\u0445 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438. \u0418\u0445 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435. \u0418\u0445 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043b\u043e\u044f\u043c\u0438. \u0418\u0445 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0437 \u0444\u0430\u0439\u043b\u0430. \u0418\u0445 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043a\u0430\u043a \u0438\u0442\u043e\u0433\u043e\u0432\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e. \u0418\u0445\u2026 \u0438\u043b\u0438 \u044f \u0443\u0436\u0435 \u043f\u0440\u0438\u0434\u0438\u0440\u0430\u044e\u0441\u044c? \u041b\u0430\u0434\u043d\u043e, \u0445\u0432\u0430\u0442\u0438\u0442 \u0442\u0430\u043a \u0445\u0432\u0430\u0442\u0438\u0442, \u043d\u043e \u0435\u0441\u043b\u0438 \u0447\u0442\u043e &#8212; \u044f \u043c\u043e\u0433\u0443 \u0435\u0449\u0451.\u0411\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c Functional Options \u043e\u043d\u0438 \u0440\u0435\u0448\u0430\u043b\u0438 \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041d\u043e \u0435\u0441\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441 Resolvable Config Struct \u0443 Functional Options \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u044e\u0441: \u043e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043e\u043f\u0446\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, WithRetry(backoff, attempts, jitter) \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u041d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u044d\u0442\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0442\u0438\u043f\u0430, \u0447\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u043e \u0438 \u0440\u0435\u0434\u043a\u043e \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u043e. \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e \u0438 \u043d\u0435 \u0442\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u0442\u044c \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0437\u0434\u0435\u0440\u0436\u043a\u0438.\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432 Go \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0438 \u0447\u0430\u0449\u0435 \u043f\u043e\u0431\u0435\u0436\u0434\u0430\u044e\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 Config-\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041f\u0440\u043e\u0441\u0442\u043e \u043e\u043d\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0445\u0430\u043e\u0442\u0438\u0447\u043d\u043e. \u0413\u0434\u0435-\u0442\u043e \u0435\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0433\u0434\u0435-\u0442\u043e \u043d\u0435\u0442\u2026 \u0413\u0434\u0435-\u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0433\u0434\u0435-\u0442\u043e \u043d\u0435\u0442\u2026 \u0413\u0434\u0435-\u0442\u043e \u0441\u0441\u044b\u043b\u043e\u0447\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0433\u0434\u0435-\u0442\u043e \u043d\u0435\u0442\u2026 \u0413\u0434\u0435-\u0442\u043e 0 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u00ab\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\u00bb, \u0430 \u0433\u0434\u0435-\u0442\u043e \u2014 \u00ab\u044f\u0432\u043d\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043e\u00bb. \u041f\u043b\u044e\u0441 \u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0435\u043b\u043a\u0438\u0445 \u043e\u0442\u043b\u0438\u0447\u0438\u0439, \u043d\u043e, \u0434\u0443\u043c\u0430\u044e, \u0432\u044b \u0432\u0441\u0435 \u0443\u0436\u0435 \u0443\u0437\u043d\u0430\u043b\u0438 \u0441\u0432\u043e\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u044b.\u0418\u043c\u0435\u043d\u043d\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0445\u0430\u043e\u0441\u0430 \u0438 \u0432\u044b\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043d\u0430\u0437\u044b\u0432\u0430\u044e Resolvable Config Struct.\u042d\u0442\u043e \u043d\u0435 \u00ab\u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441 \u043f\u043e\u043b\u044f\u043c\u0438\u00bb, \u0430 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0439, \u0443\u0436\u0435 \u0434\u043e\u043c\u0438\u043d\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432 Go \u0441\u0442\u0438\u043b\u044c \u043a \u0435\u0434\u0438\u043d\u043e\u043c\u0443 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0443 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e.\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Resolvable Config StructResolvable Config Struct \u2014 \u044d\u0442\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c:\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u00ab\u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u043e \u2192 \u0432\u0437\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\u00bb \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043a\u0430\u043a \u043f\u043e\u043b\u044f \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 Config \u0438\u043b\u0438 Options;\u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e zero \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u043b\u043e \u00ab\u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u043e \u2192 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c default\u00bb; \u0435\u0441\u043b\u0438 zero \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043f\u043e\u043b\u0435 \u043f\u0435\u0440\u0435\u043e\u0444\u043e\u0440\u043c\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u044e\u0431\u044b\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0449\u0438\u043c \u044d\u0442\u0443 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c (\u043d\u0430\u043f\u0440. \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, sentinel value, enum \u0438\u043b\u0438 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435-\u0444\u043b\u0430\u0433);\u0435\u0441\u043b\u0438 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043e\u0447\u043d\u044b\u0435 \u043f\u043e\u043b\u044f, \u043e\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 Clone() (deep copy);\u043f\u0435\u0440\u0435\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u044b\u0439 Resolve(), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u0442, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0438 \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442.\u0422\u043e \u0435\u0441\u0442\u044c \u044d\u0442\u043e \u043f\u043e\u043b\u043d\u044b\u0439 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438: \u0441\u044b\u0440\u043e\u0439 Config \u2192 Clone() \u2192 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u2192 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u2192 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u2192 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 Config.\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 Resolve() \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0434\u0435\u0442\u0430\u043b\u044c\u044e, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u043e\u0439 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432, \u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044d\u0442\u043e \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430. \u0418\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u0437 \u043f\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u043f\u043e\u043b\u0435\u0439 \u0432 \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u043e \u0436\u0438\u0442\u044c.\u0415\u0441\u043b\u0438 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 &#8212; \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442. \u041c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c NewClient(appName string, cfg Config). \u041e\u043d \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.\u041f\u043e\u0447\u0435\u043c\u0443 Functional Options \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0445\u0443\u0436\u0435\u041e\u0431\u044b\u0447\u043d\u043e Functional Options \u0437\u0430\u0449\u0438\u0449\u0430\u044e\u0442 \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 \u00ab\u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u00bb. \u041d\u043e \u0435\u0441\u043b\u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0435 \u043d\u0430 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432\u044b\u0437\u043e\u0432\u0430, \u0430 \u043d\u0430 \u0432\u0435\u0441\u044c \u0441\u0440\u043e\u043a \u0436\u0438\u0437\u043d\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0440\u0435\u0437\u043a\u043e \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f.1. \u042d\u0442\u043e \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 \u043e\u0431\u044a\u0451\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043e\u043f\u0446\u0438\u0438 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u0427\u0430\u0441\u0442\u043e \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f. \u0418\u043d\u043e\u0433\u0434\u0430 \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.type Option func(*Config)func WithHost(host string) Option {    return func(c *Config) { c.Host = host }}func WithPort(port int) Option {    return func(c *Config) { c.Port = port }}func WithTLS(mode TLSMode) Option {    return func(c *Config) { c.TLS = mode }}\u041d\u0430 \u0442\u0440\u0438 \u043f\u043e\u043b\u044f \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0435\u0440\u043f\u0438\u043c\u043e. \u041d\u0430 \u0434\u0435\u0441\u044f\u0442\u044c \u2014 \u0443\u0436\u0435 \u0440\u0430\u0437\u0434\u0440\u0430\u0436\u0430\u0435\u0442. \u0415\u0441\u043b\u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u0434\u0435\u043b\u0430\u044e\u0442 \u0441\u0430\u043c\u0438 \u043e\u043f\u0446\u0438\u0438 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 error &#8212; \u043a\u043e\u0434 \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0441\u0438\u043b\u044c\u043d\u0435\u0435.\u0421\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u0439 API \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:type Config struct {    Host string    Port int    TLS  TLSMode}2. \u0423 \u043d\u0438\u0445 \u043f\u043b\u043e\u0445\u0430\u044f discoverability\u041a\u043e\u0433\u0434\u0430 \u044f \u0432\u0438\u0436\u0443 Config, \u044f \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0436\u0443 \u0432\u0435\u0441\u044c \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0438\u0445 \u0442\u0438\u043f\u044b, \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0438, \u0438 \u043d\u0435\u0440\u0435\u0434\u043a\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043f\u0440\u043e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443.\u041a\u043e\u0433\u0434\u0430 \u044f \u0432\u0438\u0436\u0443 Functional Options, \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u0432\u0441\u0435 WithX \u043f\u043e \u043f\u0430\u043a\u0435\u0442\u0443, \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c API \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u0442\u043e\u0447\u043a\u0430\u043c, \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043a\u0438\u0435 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043a \u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0443, \u0430 \u043a\u0430\u043a\u0438\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443.\u042d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u0430\u0445, \u0433\u0434\u0435 WithTimeout \u0438\u043b\u0438 WithLogger \u043c\u043e\u0433\u0443\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445.3. \u0418\u0445 \u043d\u0435 \u0442\u0430\u043a \u0443\u0434\u043e\u0431\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u041e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u044b\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439: \u0447\u0430\u0441\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445.\u0421\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e:cfg := Config{AppName: &#171;billing&#187;}if debug {    cfg.TLS = TLSDisabled}if writeBuf &gt; 0 {    cfg.WriteBufferBytes = new(writeBuf)}client, err := NewClient(cfg)\u0421 \u0442\u0435\u0440\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u043c \u0435\u0449\u0451 \u043b\u0443\u0447\u0448\u0435:client, err := NewClient(Config{    AppName:          &#171;billing&#187;,    TLS:              lo.Ternary(debug, TLSDisabled, TLSDefault),    WriteBufferBytes: lo.Ternary(writeBuf &gt; 0, new(writeBuf), nil),})\u0421 Functional Options \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u0435 \u0441\u0440\u0435\u0437\u0430:opts := []Option{}if debug {    opts = append(opts, WithTLS(TLSDisabled))}if writeBuf &gt; 0 {    opts = append(opts, WithWriteBufferBytes(writeBuf))}client, err := NewClient(&#171;billing&#187;, opts&#8230;)\u0424\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. \u041d\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0437\u0434\u0435\u0441\u044c \u0447\u0430\u0449\u0435 \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u0442\u0435\u043c, \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430.4. \u0418\u0445 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c Config, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0435\u0433\u043e \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c, \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c, \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c, \u0438\u043b\u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043a\u0430\u043a \u00ab\u0438\u0442\u043e\u0433\u043e\u0432\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\u00bb.\u0421 Functional Options \u0432\u044b \u0432 \u043b\u0443\u0447\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0438\u0434\u0438\u0442\u0435 \u043d\u0430\u0431\u043e\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0439-\u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0439. \u0422\u043e \u0435\u0441\u0442\u044c \u0442\u0435\u0440\u044f\u0435\u0442\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435.\u0414\u0430, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0432\u044b \u043f\u043e\u0447\u0442\u0438 \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0435 \u044d\u0442\u0438 \u043e\u043f\u0446\u0438\u0438 \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 Config. \u041d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0441\u043e\u043c\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c: \u043e\u043d \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u0430 \u043f\u043e\u0442\u043e\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 \u0434\u0430\u043d\u043d\u044b\u0435.5. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043b\u0443\u0447\u0448\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\u041e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0438\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u043e\u0440\u043e\u043d \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0432 Go \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u00ab\u0438\u043c\u044f \u043f\u043e\u043b\u044f \u2192 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u00bb.client, err := NewClient(&#171;billing&#187;, Config{    Host:             &#171;localhost&#187;,    Port:             8443,    TLS:              TLSEnabled,    WriteBufferBytes: new(0),})\u0422\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u0443\u0434\u043e\u0431\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c, \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0432 \u0440\u0435\u0432\u044c\u044e.\u0421 Functional Options \u0437\u0430\u043f\u0438\u0441\u044c \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435 \u043a\u043e\u0440\u043e\u0447\u0435, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0443\u0436\u0435 \u043d\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043e\u0434\u043d\u043e&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-481524","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/481524","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=481524"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/481524\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=481524"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=481524"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=481524"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}