
рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдЧреЛ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдкрд╛рдВрдЪ рд╕рд╛рд▓ рдмрд╛рдж, рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рдХрд╛рдлреА рдкрд╛рдпрд╛
рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдПрдХ рдкреНрд░рдмрд▓ рд╕рдорд░реНрдердХред рдЗрд╕рдореЗрдВ
рдореИрдВ рд▓реЗрдЦ рдореЗрдВ рдЙрдирдХреЗ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рднреА рдмрддрд╛рдКрдВрдЧрд╛
рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬреЛ рдЗрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд▓реЗрдЦ рдмрд╣реБрдд рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд╣реИ рдФрд░ рдЙрджреНрджреЗрд╢реНрдпрдкреВрд░реНрдг рд╣реЛрдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
рд╕рдЪ рддреЛ рдпрд╣ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд╕рдореБрджрд╛рдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рдРрд╕реЗ рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рдкрд░ рд╕рдордп рд╡реНрдпрддреАрдд рд╣реЛрддрд╛ рд╣реИред
рдХреНрдпрд╛ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реЛ
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╣рдорд╛рд░реЗ рдХреЗ рдЪрд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ
рдРрд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЬрд┐рдирдХреЗ рдореВрд▓реНрдп рд╣рдо рдмрд╛рд╣рд░ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рддрд░реНрдХ рдпрд╛ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкреИрд░рд╛рдореАрдЯрд░, рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ,
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд┐рд╕реНрдХ рдкрд░ рдпрд╛ рдХрд╣реАрдВ рднреА рдиреЗрдЯрд╡рд░реНрдХ, рдбреЗрдЯрд╛рдмреЗрд╕ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рдбреЗрдЯрд╛ рдФрд░ рдЗрддрдиреЗ рдкрд░ред
рдЪреВрдВрдХрд┐ рдЧреЛ рдПрдХ рджреГрдврд╝рддрд╛ рд╕реЗ рд╕реНрдерд┐рд░ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЪрд╛рд╣реЗрдВрдЧреЗ
рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЪрд░ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдУрдкрди-рд╕реЛрд░реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдпрд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рднреА рд╣реИрдВ,
рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ред рдЙрдирдореЗрдВ рд╕реЗ рдЬреНрдпрд╛рджрд╛рддрд░ рдЕрдкрдиреА рджреГрд╖реНрдЯрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред
рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред
рдореИрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдХрдо рд╕рд╛рдорд╛рдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореБрдЭреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИред
flag
рдкреИрдХреЗрдЬ
рд╣рд╛рдВ, рдпрд╣ рдордЬрд╛рдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рд░ рдЪреАрдЬ рдкрд░ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ
рдкреНрд░рд╕рд┐рджреНрдз рдЧреЛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреИрдХреЗрдЬред
рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, flag
рдХрдорд╛рдВрдб рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрдкрдХрд░рдг рд╣реИ
рд▓рд╛рдЗрдиреЗрдВ рдФрд░ рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг ред рдФрд░ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ
flag
рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдкреИрд░рд╛рдореАрдЯрд░ рд░рдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред
flag
рдкреИрдХреЗрдЬ рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
- flag.String()
, flag.Int()
рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ flag.Duration()
ред flag.Duration()
ред
рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ []string
рдпрд╛ time.Time
рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ
flag.Value
, рдЬреЛ рдЖрдкрдХреЛ рдпрд╣ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ flag.Value
рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдорд╛рди flag.Value
рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдк time.Time
рдХрд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдЗрд╕ рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдкреИрдХреЗрдЬ рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрдкрддреНрддрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЗрд╕рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╣реИ - flag
рд╣реИ
рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рдорд╛рдирдХ рддрд░реАрдХрд╛ , рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдЗрд╕рдХреА рд╕рдВрднрд╛рд╡рдирд╛
рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдмреАрдЪ рдЙрдкрдпреЛрдЧ рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╣реИ
рд╕рдореБрджрд╛рдп рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпред
flag
рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреНрдпреЛрдВ рдирд╣реАрдВ?
рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рджреЛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдореМрдЬреВрдж рд╣реИрдВ:
- рдкреИрд░рд╛рдореАрдЯрд░ рди рдХреЗрд╡рд▓ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ рдкрдврд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ
- рдореИрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ
рдпрджрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрдврд╝рдирд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ, рд╕рдм рдХреБрдЫ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рд╕реНрдкрд╖реНрдЯ рд╣реИ (рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ)
рдпрд╣ рдмрд╛рдж рдореЗрдВ), рдлрд┐рд░ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рд╕реАрдзреЗ рдХрд╣рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ
рдЕрдмред
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ
рд╕рдВрд░рдЪрдирд╛рдПрдБ рдЬрд┐рдирдХреЗ рдХреНрд╖реЗрддреНрд░ рдЕрдиреНрдп рд╕рдВрд░рдЪрдирд╛рдПрдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо
рдЖрдЧреЗ:
type AppConfig struct { Port int Database struct { Endpoint string Timeout time.Duration } ... }
рдФрд░ рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдореМрдЬреВрдж рд╣реИ
рдЪреМрдЦрдЯреЗ рдЬреЛ рдЖрдкрдХреЛ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ flag
рдХреЛ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ (рдпрд╛ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп) рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
flagutil
, рдЬрд┐рд╕рдХреА рдЪрд░реНрдЪрд╛ рдиреАрдЪреЗ рдХреА рдЧрдИ рд╣реИ)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдРрд╕реА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рдПрдХ рдордЬрдмреВрдд рд╣реЛрддрд╛ рд╣реИ
рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреАред
рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рд╡рд┐рдиреНрдпрд╛рд╕
рд╡рд┐рдЪрд╛рд░ рд╕рдВрд░рдЪрдирд╛ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ
рдХрд╛рд░реНрдпрдХреНрд░рдо рдФрд░ рдЬрд╣рд╛рдБ рддрдХ рд╕рдВрднрд╡ рд╣реЛ, рдЬрд╣рд╛рдБ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╛рдиреА
рд╕реАрдзреЗ рдкреИрдХреЗрдЬ рд╕реНрддрд░ рдкрд░ред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ (рдбреЗрдЯрд╛рдмреЗрд╕,
рдПрдкреАрдЖрдИ рдпрд╛ рдЬреЛ рдХреБрдЫ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)
package yoogle type Config struct { Endpoint string Timeout time.Duration } func New(c *Config) *Client {
yoogle.Config
рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ
рдкреНрд░рд╛рдкреНрдд *flag.FlagSet
рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИред *flag.FlagSet
ред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдорд╛рд░реЛрд╣ yoogle
рдкреИрдХреЗрдЬ yoogle
рдпрд╛ рдПрдХ рдкреИрдХреЗрдЬ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
yooglecfg
(рддреГрддреАрдп-рдкрдХреНрд╖ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ
рдХрд╣реАрдВ рдФрд░):
package yooglecfg import ( "flag" "app/yoogle" ) func Export(flag *flag.FlagSet) *yoogle.Config { var c yoogle.Config flag.StringVar(&c.Endpoint, "endpoint", "https://example.com", "endpoint for our API", ) flag.DurationVar(&c.Timeout, "timeout", time.Second, "timeout for operations", ) return &c }
flag
рдкреИрдХреЗрдЬ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдЖрд╡рд╢реНрдпрдХ flag.FlagSet
рддрд░реАрдХреЗ:
package yooglecfg import "app/yoogle" type FlagSet interface { StringVar(p *string, name, value, desc string) } func Export(flag FlagSet) *yoogle.Config { var c yoogle.Config flag.StringVar(&c.Endpoint, "endpoint", "https://example.com", "endpoint for our API", ) return &c }
рдФрд░ рдЕрдЧрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рдиреЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмреАрдЪ) рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ
рдХреБрдЫ рдХрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рдлрд╝рдВрдХреНрд╢рди yooglecfg.Export()
рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддрд╛ рд╣реИ
рд╕рднреА рдорд╛рдиреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд╣рд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░реНрдп
рд╡рд┐рдиреНрдпрд╛рд╕:
package yooglecfg import "app/yoogle" type FlagSet interface { StringVar(p *string, name, value, desc string) } func Export(flag FlagSet) func() *yoogle.Config { var algorithm string flag.StringVar(&algorithm, "algorithm", "quick", "algorithm used to do something", ) var c yoogle.Config return func() *yoogle.Config { switch algorithm { case "quick": c.Impl = quick.New() case "merge": c.Impl = merge.New() case "bubble": panic(...) } return c } }
рдирд┐рд░реНрдпрд╛рдд рдлрд╝рдВрдХреНрд╢рди рдЖрдкрдХреЛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЬрд╛рдиреЗ рдмрд┐рдирд╛ рдкреИрдХреЗрдЬ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рдЙрдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
рд╣рдордиреЗ рдПрдХ рдмрдбрд╝реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдФрд░ рд╣рдорд╛рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдП
рд╕реНрд╡рддрдВрддреНрд░, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рддрдХ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрди рд╕рднреА рдХреЛ рдПрдХ рд╕рд╛рде рдХреИрд╕реЗ рд▓рд╛рдпрд╛ рдЬрд╛рдП рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдП
рдорд╛рдиред
рдпрд╣ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛ рдХрд┐ flagutil
рдкреИрдХреЗрдЬ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред
рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ, рдЗрд╕рдХреЗ рдкреИрдХреЗрдЬ рдФрд░ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЙрдирдХреЗ рдЙрдкрд╕рд░реНрдЧ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ
рдФрд░ рдкреИрдХреЗрдЬ рд╕реНрддрд░ рдкрд░ рдПрдХрддреНрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:
package main import ( "flag" "app/yoogle" "app/yooglecfg" "github.com/gobwas/flagutil" ) func main() { flags := flag.NewFlagSet("my-app", flag.ExitOnError) var port int flag.IntVar(&port, "port", 4050, "port to bind to", ) var config *yoogle.Config flagutil.Subset(flags, "yoogle", func(sub *flag.FlagSet) { config = yooglecfg.Export(sub) }) }
flagutil.Subset()
рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдпрд╣ рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдЬреЛрдбрд╝рддрд╛ рд╣реИ
( "yoogle"
) рдХреЙрд▓рдмреИрдХ рдХреЗ рдЕрдВрджрд░ sub
рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдПред
рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдирд╛ рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
app -port 4050 -yoogle.endpoint https://example.com -yoogle.timeout 10s
рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
flag.FlagSet
рдЕрдВрджрд░ рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ред flag.FlagSet
рдореЗрдВ flag.FlagSet
рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрддрд╛ рд╣реИред flag.Value
,
рдЬрд┐рд╕рдореЗрдВ рдПрдХ Set(string) error
рд╡рд┐рдзрд┐ рд╣реИ - рдЕрд░реНрдерд╛рдд, рдпрд╣ рдПрдХ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ
рдорд╛рди рдХрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╕реЗрдЯ рдХрд░рдирд╛ред
рдпрд╣ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдЬреЛрдбрд╝реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рд╕реА рднреА рд╕реНрд░реЛрдд рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдФрд░
рдПрдХ flag.Set(key, value)
рдмрдирд╛рдУред flag.Set(key, value)
рдХреЙрд▓ рдХрд░реЗрдВред
рдпрд╣ рд╣рдореЗрдВ рдХрдорд╛рдВрдб рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрддрд╛ рд╣реИ
flag
рдкреИрдХреЗрдЬ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд▓рд╛рдЗрдиреЗрдВред рдЖрдк рддрд░реНрдХреЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ,
рдЙрджрд╛ред рдкреЙрдЬрд╝рд┐рдХреНрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рддрд░реНрдХреЛрдВ рдХреА рддрд░рд╣ред
package main func main() { flags := flag.NewFlagSet("my-app", flag.ExitOnError)
рддрджрдиреБрд╕рд╛рд░, config.json
рдлрд╝рд╛рдЗрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:
{ "port": 4050, "yoogle": { "endpoint": "https://example.com", "timeout": "10s" ... } }
рдирд┐рд╖реНрдХрд░реНрд╖
рдмреЗрд╢рдХ, рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдмрд╛рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реВрдВред рдмрд╣реБрдд рд╕реЗ
рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдЪрд╛рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдФрд░ рдХрдИ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдЬрдм рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
рдореИрдВрдиреЗ MailRu рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛ред
рддреЛ, рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕рдордп рдмрд░реНрдмрд╛рдж рди рдХрд░реЗрдВ
рдЕрдЧрд▓реЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдврд╛рдВрдЪреЗ рдХрд╛ рдЕрдзреНрдпрдпрди (рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд▓реЗрдЦрди) рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд:
flag
рдЙрдкрдпреЛрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░реЗрдВ
рдХрд╛рд░реНрдпрдХреНрд░рдо- рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЬреНрдЮрд╛рди рдХреЗ рдмрд┐рдирд╛, рдкреНрд░рддреНрдпреЗрдХ рдкреИрдХреЗрдЬ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ рдФрд░
рдмрд╛рдж рдореЗрдВ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ - рдорд╛рди, рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рдВрд░рдЪрдирд╛ рдХреЛ
main
рд╕реЗ рдкрдврд╝рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ
flagutil
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрд░реЗ рдкрд░рд┐рдЪрд┐рдд flagutil
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ flagutil
рдкреАрдЯрд░рдмрд░реНрдЧрдмрд░реНрдЧ / рдПрдлрдПрдл - рдФрд░ рдореИрдВ flagutil
рдирд╣реАрдВ flagutil
, рдЕрдЧрд░ рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ
рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╡рд┐рд╕рдВрдЧрддрд┐рдпрд╛рдВред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рд╕рдВрджрд░реНрдн