рдЧреЛ-рдЖрд▓реЛрдЪрдХ: рдЧреЛ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЬрд┐рджреНрджреА рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ


рд╣рдо рдЧреЛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рд▓рд┐рдВрдЯрд░ (рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ) рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рднреА рд╣реИред


рдЧреЛ-рдЖрд▓реЛрдЪрдХ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:


  • рдкрд░реАрдХреНрд╖рдг рдХреЗ "рдЕрдЪреНрдЫрд╛ рдкрд░реНрдпрд╛рдкреНрдд" рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рди рд╣реЛ
  • рдпрджрд┐ рдЪреЗрдХ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рдо "рд░рд╛рдп" рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ
  • рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рд▓рд┐рдВрдЯрд░ рд▓рд┐рдЦрдирд╛ рдЖрдо рддреМрд░ рдкрд░ рдореМрдЬреВрджрд╛ рдврд╛рдВрдЪреЗ рдореЗрдВ рдПрдХ рдирдпрд╛ рдЪреЗрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЛ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИред

рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╣рдо рдЧреЛ-рдЖрд▓реЛрдЪрдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдФрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ, рдЗрд╕рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдХреБрдЫ рдЪреЗрдХ , рдФрд░ рдЗрд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдЪрд░рдгреЛрдВ рдХрд╛ рднреА рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗред


рдЬрд▓реНрджреА рд╢реБрд░реВ рдХрд░реЛ


$ cd $GOPATH $ go get -u github.com/go-critic/go-critic/... $ ./bin/gocritic check-package strings $GOROOT/src/strings/replace.go:450:22: unslice: could simplify s[:] to s $GOROOT/src/strings/replace.go:148:2: elseif: should rewrite if-else to switch statement $GOROOT/src/strings/replace.go:156:3: elseif: should rewrite if-else to switch statement $GOROOT/src/strings/replace.go:219:3: elseif: should rewrite if-else to switch statement $GOROOT/src/strings/replace.go:370:1: paramTypeCombine: func(pattern string, value string) *singleStringReplacer could be replaced with func(pattern, value string) *singleStringReplacer $GOROOT/src/strings/replace.go:259:2: rangeExprCopy: copy of r.mapping (256 bytes) can be avoided with &r.mapping $GOROOT/src/strings/replace.go:264:2: rangeExprCopy: copy of r.mapping (256 bytes) can be avoided with &r.mapping $GOROOT/src/strings/strings.go:791:1: paramTypeCombine: func(s string, cutset string) string could be replaced with func(s, cutset string) string $GOROOT/src/strings/strings.go:800:1: paramTypeCombine: func(s string, cutset string) string could be replaced with func(s, cutset string) string $GOROOT/src/strings/strings.go:809:1: paramTypeCombine: func(s string, cutset string) string could be replaced with func(s, cutset string) string $GOROOT/src/strings/strings.go:44:1: unnamedResult: consider to give name to results $GOROOT/src/strings/strings.go:61:1: unnamedResult: consider to give name to results $GOROOT/src/strings/export_test.go:28:3: rangeExprCopy: copy of r.mapping (256 bytes) can be avoided with &r.mapping $GOROOT/src/strings/export_test.go:42:1: unnamedResult: consider to give name to results 

(рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рд╛рд░реВрдкрдг рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ; рдореВрд▓ рдЬреАрд╕реНрдЯ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред)


Gocritic рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдЙрдирдХреЗ рдЖрдпрд╛рдд рдкрде ( check-package ) рджреНрд╡рд╛рд░рд╛ рдЬрд╛рдВрдЪ рд╕рдХрддреА рд╣реИ, рдФрд░ рд╕рднреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ ( check-project ) рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рднреА рдХрд░ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдкреВрд░реЗ $GOROOT рдпрд╛ $GOPATH рдХреЛ рдПрдХ рд╣реА рдХрдорд╛рдВрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:


 $ gocritic check-project $GOROOT/src $ gocritic check-project $GOPATH/src 

рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдХреЗ рд▓рд┐рдП "рд╢реНрд╡реЗрдд рд╕реВрдЪреА" рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реИ рдЬреЛ рдЪреЗрдХ ( -enable рдзреНрд╡рдЬ) рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рднреА рдЪреЗрдХ рдЬреЛ рдХрд┐ Experimental рдпрд╛ VeryOpinionated рдЖрдЗрдХрди рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рд╣реИрдВ, VeryOpinionated рдЬрд╛рддреЗ VeryOpinionated ред


рдЧреЙрд▓реИрдиреНрд╕реНрдХреА-рд▓рд┐рдВрдЯ рдФрд░ рдЧреЛрдореЗрдЯрд╛рд▓рд┐рдЯрд░реНрди рдореЗрдВ рдПрдХреАрдХрд░рдг рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ ред


рдпрд╣ рд╕рдм рдХреИрд╕реЗ рд╢реБрд░реВ рд╣реБрдЖ


рдЧреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЕрдЧрд▓реА рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдирд╛, рдпрд╛ рдХреБрдЫ 3-рдЖрд░рдбреА рдкрд╛рд░реНрдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдСрдбрд┐рдЯ рдХрд░рдирд╛, рдЖрдк рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЖрдкрдХреЗ рдЕрдлрд╕реЛрд╕ рдХреЗ рд▓рд┐рдП, рдПрдХ рд▓рд┐рдВрдЯрд░ рдХреЛ рдвреВрдВрдврдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ рдЬреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдирд┐рджрд╛рди рдХрд░реЗрдЧрд╛ред


рдЖрдкрдХрд╛ рдкрд╣рд▓рд╛ рдХрджрдо рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рдиреЗ рдФрд░ рдореМрдЬреВрджрд╛ рд▓рд┐рдВрдЯрд░ рдХреЗ рд▓реЗрдЦрдХреЛрдВ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реБрдП рдХрд┐ рд╡реЗ рдПрдХ рдирдпрд╛ рдЪреЗрдХ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдЕрддреНрдпрдзрд┐рдХ рдирд┐рд░реНрднрд░ рд╣реИ рдФрд░ рдХрд╛рдлреА рдХрдо рд╣реЛ рд╕рдХрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдорд╣реАрдиреЛрдВ рдХрд╛ рдкрд╛рд▓рди рд╣реЛрдЧрд╛ред


рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдЪреЗрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ рдХрд┐рд╕реА рдХреЗ рджреНрд╡рд╛рд░рд╛ рднреА рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рдпрд╛ рдЕрдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╕рдЯреАрдХ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?


рд╢рд╛рдпрдж рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЬрд╛рдБрдЪ рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ?


go-critic рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдШрд░ рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИ рдЬреЛ рдХрд┐ рдореМрдЬреВрджрд╛ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЦреБрдж рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред go-critic рдЙрдкрдХрд░рдг рд╕реНрд╡рдпрдВ рд╣реА рдПрдХ рдирдИ рдЬрд╛рдБрдЪ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдВрджрд░реНрдн рдФрд░ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИ - рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдЧрд┐рдирддреА рдирд╣реАрдВ)ред


рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЖрд▓реЛрдЪрдХ


рдПрдХ рдЖрд▓реЛрдЪрдХ рдирд┐рдпрдореЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ рдЬреЛ рдЪреЗрдХ рдЧреБрдгреЛрдВ рдФрд░ рдорд╛рдЗрдХреНрд░реЛ- рдЪреЗрдХрд░реНрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдирд┐рдпрдо рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдХреЛрдб рдирд┐рд░реАрдХреНрд╖рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред


рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬреЛ рдПрдХ рд▓рд┐рдВрдЯрд░ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, cmd / gocritic рдпрд╛ golangci-lint ) рд╕рдорд░реНрдерд┐рдд рдирд┐рдпрдореЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЗ рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдЪрдпрдирд┐рдд рдирд┐рдпрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдЕрдзреНрдпрдпрди рдХреЗ рддрд╣рдд рдкреИрдХреЗрдЬ рдкрд░ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИред


рдПрдХ рдирдпрд╛ рдЪреЗрдХрд░ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХрд╛рдо рддреАрди рдореБрдЦреНрдп рдЪрд░рдгреЛрдВ рдореЗрдВ рдЙрдмрд▓рддрд╛ рд╣реИ:


  1. рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝рдирд╛ред
  2. рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реНрд╡рдпрдВред
  3. рд▓рд┐рдВрдЯрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдЬреЛрдбрд╝рдирд╛ред

рд╣рдо рдЙрджрд╛рд╣рд░рдг рдХреИрдкреНрд╢рди рдХреЗ рдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрди рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рд╕реЗ рдЧреБрдЬрд░реЗрдВрдЧреЗ , рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рдирд╛рдореЛрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдПрдХ рдмрдбрд╝реЗ рдЕрдХреНрд╖рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред



рдЯреЗрд╕реНрдЯ рдЬреЛрдбрд╝рдирд╛


рдПрдХ рдирдП рдЪреЗрдХ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд▓рд┐рдВрдЯ / рдЯреЗрд╕реНрдЯрдбреЗрдЯрд╛ рдореЗрдВ рдПрдХ рдирдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдкреНрд░рддреНрдпреЗрдХ рдРрд╕реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ positive_tests.go рдлрд╝рд╛рдЗрд▓ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдЪреЗрдХ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХрддрд╛ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдПрдХ "рд╕рд╣реА" рдХреЛрдб рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдирдП рдЪреЗрдХ рдХреЛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдП ( negative_tests.go )ред


рдЙрджрд╛рд╣рд░рдг:


 // lint/testdata/positive_tests.go /// consider `in' name instead of `IN' /// `X' should not be capitalized /// `Y' should not be capitalized /// `Z' should not be capitalized func badFunc1(IN, X int) (Y, Z int) { /// `V' should not be capitalized V := 1 return V, 0 } 

 // lint/testdata/negative_tests.go func goodFunc1(in, x int) (x, y int) { v := 1 return v, 0 } 

рдЖрдк рдПрдХ рдирдпрд╛ рд▓рд┐рдВрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред


рд╕рддреНрдпрд╛рдкрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЪреЗрдХрд░ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ: lint/captLocal_checker.go ред
рд╕рдореНрдореЗрд▓рди рджреНрд╡рд╛рд░рд╛, рд╕рднреА рдорд╛рдЗрдХреНрд░реЛ-рд▓рд┐рдВрдЯрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ _checker рдкреНрд░рддреНрдпрдп рд╣реИред


 package lint //  тАЬCheckerтАЭ    . type captLocalChecker struct { checkerBase upcaseNames map[string]bool } 

checkerBase рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЪреЗрдХрд░ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд▓рд┐рдВрдЯрд░ рдореЗрдВ рдХрдо рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, checkerBase рдореЗрдВ lint.context рдХрд╛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛ рд░рд╣реА рдЕрдиреНрдп рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред


upcaseNames рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЬреНрдЮрд╛рдд рдирд╛рдореЛрдВ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕реЗ рд╣рдо upcaseNames рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░реЗрдВрдЧреЗред upcaseNames strings.ToLower(name) рд╕рдВрд╕реНрдХрд░рдгред рдЙрди рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рд╕рдореНтАНрдорд┐рд▓рд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдпрд╣ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдХреИрдкрд┐рдЯрд▓ рд▓реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдХреЛрдИ рд╕рд╣реА рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдЖрдВрддрд░рд┐рдХ рдЕрд╡рд╕реНрдерд╛ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
Init() рд╡рд┐рдзрд┐ рдХреЛ рдХреЗрд╡рд▓ рдЙрди рд▓рд┐рдВрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


 func (c *captLocalChecker) Init() { c.upcaseNames = map[string]bool{ "IN": true, "OUT": true, "INOUT": true, } } 

рдЕрдм рдЖрдкрдХреЛ рдЪреЗрдХрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡рдпрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
captLocal рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рд╕рднреА рд╕реНрдерд╛рдиреАрдп ast.Ident рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдирдП рдЪрд░ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВред


рдирд╛рдореЛрдВ рдХреА рд╕рднреА рд╕реНрдерд╛рдиреАрдп рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдХ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП:


 VisitLocalDef(name astwalk.Name, initializer ast.Expr) 

рдЙрдкрд▓рдмреНрдз рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рд╕реВрдЪреА рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдВрдЯ / рдЖрдВрддрд░рд┐рдХ / рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдореЗрдВ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
captLocal рд▓рд╛рдЧреВ LocalDefVisitor ред


 //  ast.Expr,         //  .      . func (c *captLocalChecker) VisitLocalDef(name astwalk.Name, _ ast.Expr) { switch { case c.upcaseNames[name.ID.String()]: c.warnUpcase(name.ID) case ast.IsExported(name.ID.String()): c.warnCapitalized(name.ID) } } func (c *captLocalChecker) warnUpcase(id *ast.Ident) { c.ctx.Warn(id, "consider `%s' name instead of `%s'", strings.ToLower(id.Name), id) } func (c *captLocalChecker) warnCapitalized(id ast.Node) { c.ctx.Warn(id, "`%s' should not be capitalized", id) } 

рдЕрдзрд┐рд╡реЗрд╢рди рдХреЗ рджреНрд╡рд╛рд░рд╛, рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреБрд░реНрд▓рдн рдЕрдкрд╡рд╛рдж рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдирд┐рдпрдо рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред


рдкреНрд░рд▓реЗрдЦрди рдЬреЛрдбрд╝рдирд╛


рдПрдХ рдЕрдиреНрдп рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдзрд┐ рд╣реИ InitDocumentation :


 func (c *captLocalChecker) InitDocumentation(d *Documentation) { d.Summary = "Detects capitalized names for local variables" d.Before = `func f(IN int, OUT *int) (ERR error) {}` d.After = `func f(in int, out *int) (err error) {}` } 

рдЖрдорддреМрд░ рдкрд░, рдХреЗрд╡рд▓ 3 рдлрд╝реАрд▓реНрдб рднрд░реЗрдВ:


  • Summary - рдПрдХ рд╡рд╛рдХреНрдп рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рд╡рд┐рд╡рд░рдгред
  • Before - рд╕реБрдзрд╛рд░ рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдбред
  • After - рд╕реБрдзрд╛рд░ рдХреЗ рдмрд╛рдж рдХреЛрдб (рдЪреЗрддрд╛рд╡рдиреА рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред

рдкреНрд░рд▓реЗрдЦрди рдкреАрдврд╝реА

рдирдП рд▓рд┐рдВрдЯрд░ рдХреЗ рд▓рд┐рдП рдкреБрди: рд╕реГрдЬрди рдкреНрд░рд▓реЗрдЦрди рдПрдХ рд╢рд░реНрдд рдирд╣реАрдВ рд╣реИ, рд╢рд╛рдпрдж рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдпрд╣ рдХрджрдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЕрднреА рднреА рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдлрд╛рдЗрд▓ рдХреИрд╕реЗ рджрд┐рдЦреЗрдЧреА, make docs рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред docs/overview.md . docs/overview.md рдлрд╝рд╛рдЗрд▓ рдЕрдкрдбреЗрдЯ рдХреА рдЬрд╛рдПрдЧреАред


рдПрдХ рдирдпрд╛ рд▓рд┐рдВрдЯрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВ


рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢ рдПрдХ рдирдП рд▓рд┐рдВрдЯрд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░ рд░рд╣рд╛ рд╣реИ:


 //   captLocal_checker.go init . func init() { addChecker(&captLocalChecker{}, attrExperimental, attrSyntaxOnly) } 

addChecker рдирдП рд▓рд┐рдВрдЯрд░ рдХреЗ рд╢реВрдиреНрдп-рдорд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рд╡реИрд░реЗрдбрд┐рдХ рддрд░реНрдХ рдЖрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рд╢реВрдиреНрдп рдпрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдирд┐рдпрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЧреБрдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред


attrSyntaxOnly , attrSyntaxOnly рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдорд╛рд░реНрдХрд░ рд╣реИ рдЬреЛ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЯрд╛рдЗрдк рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдЯрд╛рдЗрдк рдЪреЗрдХ рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдиреНрд╣реЗрдВ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред golangci-lint рдРрд╕реЗ рд▓рд┐рдВрдЯрд░ рдХреЛ "рддреЗрдЬрд╝" рдЭрдВрдбреЗ рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ)ред


attrExperimental рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕рднреА рдирдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдЪреЗрдХ рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рдмрд╛рдж рд╣реА рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╣рдЯрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИред


рдЕрдм рдЬрдм рдирдпрд╛ рд▓рд┐рдВрдЯрд░ рдПрдб-рдЪреЗрдХрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдВрдЬреАрдХреГрдд рд╣реИ, рддреЛ рдЖрдк рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:


 #  GOPATH: $ go test -v github.com/go-critic/go-critic/lint #  GOPATH/src/github.com/go-critic/go-critic: $ go test -v ./lint #  ,      make: $ make test 

рдЖрд╢рд╛рд╡рд╛рджреА рд╡рд┐рд▓рдп (рд▓рдЧрднрдЧ)


рдкреБрд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдЖрд╢рд╛рд╡рд╛рджреА рд╡рд┐рд▓рдп рдХреА рд░рдгрдиреАрддрд┐ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЙрди рдкреАрдЖрд░рдПрд╕ рдХреА рд╕реНрд╡реАрдХреГрддрд┐ рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдХреЗ рд▓рд┐рдП рд╕рдореАрдХреНрд╖рдХ рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ, рджрд╛рд╡реЛрдВ рдореЗрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреИрдЪ рдХреЗ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рдПрдХ рдкреАрдЖрд░ рд╕рдореАрдХреНрд╖рдХ рд╕реЗ рдкрд╛рд▓рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЗрди рдХрдорд┐рдпреЛрдВ рдХреЛ рд╕рд╣реА рдХрд░рддрд╛ рд╣реИ, рдореВрд▓ рдкреИрдЪ рдХреЗ рд▓реЗрдЦрдХ рдХреЛ рд╕реАрд╕реА (рдХреЙрдкреА) рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд▓рд┐рдВрдЯрд░ рдорд╛рд░реНрдХрд░ рднреА рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдкреВрд░реНрдг рд╕рд╣рдорддрд┐ рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ рд▓рд╛рд▓ рдЭрдВрдбреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


  1. Experimental : рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХ рдХреА рдПрдХ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЕрдкреНрд░рднрд╛рд╡реА рд╣реЛ рд╕рдХрддреА рд╣реИ (рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕реНрд░реЛрдд рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ), рдпрд╛ рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ "рдЧрд┐рд░рд╛рд╡рдЯ"ред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ attrExperimental рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ attrExperimental рд╣реИрдВред рдХрднреА-рдХрднреА, рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдХреА рдорджрдж рд╕реЗ, рдЙрди рдЬрд╛рдВрдЪреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реА рдкреНрд░рддрд┐рдмрджреНрдз рд╕реЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рдирд╛рдо рдЦреЛрдЬрдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣реАрдВред
  2. VeryOpinionated : рдпрджрд┐ рдЪреЗрдХ рдореЗрдВ рджреЛрдиреЛрдВ рд░рдХреНрд╖рдХреЛрдВ рдФрд░ рджреБрд╢реНрдорди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ attrVeryOpinionated рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдЗрд╕ рддрд░рд╣, рд╣рдо рдХреЛрдб рд╢реИрд▓реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреБрдЫ рдЧреЙрдлрд╝рд░реЛрдВ рдХреЗ рд╕реНрд╡рд╛рдж рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВред

Experimental рд╕реЗ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд╕реНрдерд╛рдпреА рдФрд░ рдирд┐рд░реНрдзрд╛рд░рдг рдпреЛрдЧреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдВрдкрддреНрддрд┐ рд╣реИред VeryOpinionated рдПрдХ рдЕрдзрд┐рдХ рдореМрд▓рд┐рдХ рдирд┐рдпрдо рд╕рдВрдкрддреНрддрд┐ рд╣реИ рдЬреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛ рд░рд╣реА рд╣реИред


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬреАрдердм рдкрд░ рдПрдХ [checker-request] рдЯрд┐рдХрдЯ рдмрдирд╛рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджрд╛ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВред


рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, CONTRIBUTING.md рджреЗрдЦреЗрдВред
рдореВрд▓ рдирд┐рдпрдо рдореБрдЦреНрдп рдирд┐рдпрдо рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВред


рдмрд┐рджрд╛рдИ рд╢рдмреНрдж


рдЖрдк рди рдХреЗрд╡рд▓ рдирдП рд▓рд┐рдВрдЯрд░ рдЬреЛрдбрд╝рдХрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рднрд╛рдЧ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред
рдХрдИ рдЕрдиреНрдп рддрд░реАрдХреЗ рд╣реИрдВ:


  • рдЗрд╕реЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдпрд╛ рдмрдбрд╝реЗ / рдкреНрд░рд╕рд┐рджреНрдз рдУрдкрди-рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдкрд░ рдЖрдЬрд╝рдорд╛рдПрдБ рдФрд░ рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХ, рдЧрд▓рдд рдирдХрд╛рд░рд╛рддреНрдордХ рдФрд░ рдЕрдиреНрдп рдХрдорд┐рдпреЛрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдВред рд╣рдо рдЖрднрд╛рд░реА рд╣реЛрдВрдЧреЗ рдпрджрд┐ рдЖрдк рдЯреНрд░реЙрдлреА рдкреГрд╖реНрда рдкрд░ рдкрд╛рдИ рдЧрдИ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдиреЛрдЯ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
  • рдирдП рдирд┐рд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рд╡ рджреЗрдВред рдпрд╣ рд╣рдорд╛рд░реЗ рдЯреНрд░реИрдХрд░ рдкрд░ рдПрдХ рдореБрджреНрджрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
  • рдореМрдЬреВрджрд╛ рд▓рд┐рдВрдЯрд░ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝реЗрдВред

go-critic рдЖрдкрдХреЗ рдЧреЛ рдХреЛрдб рдХреА рдЖрд▓реЛрдЪрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реЛрдВ рдХреА рдЖрд╡рд╛рдЬрд╝ рдХреЗ рд╕рд╛рдеред рд╣рд░ рдХреЛрдИ рдЖрд▓реЛрдЪрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП - рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ!


Source: https://habr.com/ru/post/hi414739/


All Articles