-
Notifications
You must be signed in to change notification settings - Fork 8
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 statementswithout 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.