Description
Issue Requirements
Thank you for creating the issue!
Please include the following information:
-
Version of golangci-lint:
golangci-lint --version
(or git commit if you don't use binary distribution)
golangci-lint has version v1.19.1
-
Config file:
cat .golangci.yml
Not applicable
-
Go environment:
go version && go env
GO111MODULE=""
GOARCH="amd64"
GOBIN="/home/u0/bin"
GOCACHE="/home/u0/.cache/go-build"
GOENV="/home/u0/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/u0"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/home/u0/Documents/gosandbox/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build509950643=/tmp/go-build -gno-record-gcc-switches"
- Verbose output of running:
golangci-lint run -v
Not applicable
Problem
I getting a lot of funlen
false positive and this linter's configurations make no sense. The command I use on daily basis is:
$ golangci-lint run --color never --enable-all "$dirpath"
Now I have to alter it to either:
$ golangci-lint run --color never --enable-all --disable=funlen "$dirpath"
OR
create a configuration file that set `funlen` instead of
using golang-lint off the shelves.
OR
commit new codes all over the places with //nolint:funlen
Reason for Changes
package float
//nolint:funlen
func testENDECScenarios() []testENDECScenario {
return []testENDECScenario{
{
UID: 1,
TestType: testToString,
Description: `
Float.ToString is able to convert:
1. positive float32
2. positive accuracy
3. to Normal format
`,
Switches: map[string]bool{
useNormalFormat: true,
usePositiveFloat32: true,
usePositiveAccuracy: true,
},
}, {
UID: 2,
TestType: testToString,
Description: `
Float.ToString is able to convert:
1. zero float32
2. positive accuracy
3. to Normal format
`,
Switches: map[string]bool{
useNormalFormat: true,
useZeroFloat32: true,
usePositiveAccuracy: true,
},
}, {
UID: 3,
TestType: testToString,
Description: `
Float.ToString is able to convert:
1. negative good float32
2. positive accuracy
3. to Normal format
`,
Switches: map[string]bool{
useNormalFormat: true,
useNegativeFloat32: true,
usePositiveAccuracy: true,
},
}, {
UID: 4,
TestType: testToString,
Description: `
Float.ToString is able to convert:
1. none
2. positive accuracy
3. to Normal format
`,
Switches: map[string]bool{
useNormalFormat: true,
usePositiveAccuracy: true,
},
}, {
UID: 5,
TestType: testToString,
Description: `
Float.ToString is able to convert:
1. positive float32
2. zero accuracy
3. to Normal format
`,
Switches: map[string]bool{
useNormalFormat: true,
usePositiveFloat32: true,
useZeroAccuracy: true,
},
}, {
UID: 6,
TestType: testToString,
Description: `
Float.ToString is able to convert:
1. positive float32
2. negative accuracy
3. to Normal format
`,
Switches: map[string]bool{
useNormalFormat: true,
usePositiveFloat32: true,
useNegativeAccuracy: true,
},
}, {
UID: 7,
TestType: testToString,
Description: `
Float.ToString is able to convert:
1. positive float32
2. positive accuracy
3. to Scientific format
`,
Switches: map[string]bool{
useScientificFormat: true,
usePositiveFloat32: true,
usePositiveAccuracy: true,
},
}, {
UID: 8,
TestType: testToString,
Description: `
Float.ToString is able to convert:
1. zero float32
2. positive accuracy
3. to Scientific format
`,
Switches: map[string]bool{
useScientificFormat: true,
useZeroFloat32: true,
usePositiveAccuracy: true,
},
}, {
UID: 9,
TestType: testToString,
Description: `
Float.ToString is able to convert:
1. negative good float32
2. positive accuracy
3. to Scientific format
`,
Switches: map[string]bool{
useScientificFormat: true,
useNegativeFloat32: true,
usePositiveAccuracy: true,
},
...
}
This is a generator function that generates configurations data structure slices. It is obviously went over the limit of 60
. Keeping it outside the function means the encouragement of using global variable, which is a bigger concern that keeping a function to a fix 60 length, 40 statements rule.
Some logical functions can easily go beyond 60
like https://github.com/kubernetes/kubernetes/blob/master/pkg/controller/garbagecollector/garbagecollector.go#L164.
By setting 60:40
, the tool encourages programmers to spin multiple unnecessary small functions consisting of multiple functions OR forcing them not to tidy up their codes (E.g. braces management).
It takes a passionate Go programmer to the extend of altering the configurations so it will generate a lot of unnecessary noises between the new comers and seasoned developers.
Suggestion
- Do add heuristic analysis against the function natively OR
- Do not fix some brules to
60 lines, 40 statements
without thorough research about practical meta-programming and take some actions like:
2.1. Study and revise the brules with thorough discussions and data-driven.
2.2. Setting the linter to only provide information, not warning / action-required.