V8001. There are identical subexpressions to the left and to the right of the 'foo' operator.
Анализатор обнаружил фрагмент кода, который может содержать логическую ошибку. В тексте программы присутствует бинарное выражение, в котором левое и правое подвыражение одинаковы. В качестве оператора такого выражения могут быть: <, >, <=, >=, ==, !=, &&, ||, -, /, &, | или ^.
Рассмотрим пример:
func ConvertRGB(rgb RGBContainer) {
if rgb.R > 1 && rgb.G > 1 && rgb.R > 1 {
....
}
....
}
В данном случае в условии есть два подвыражения rgb.R > 1, объединённые с помощью оператора &&. Допущена ошибка по невнимательности, поскольку нет смысла использовать одно и то же подвыражение несколько раз через логический оператор &&.
Корректный код, который не вызовет подозрений у анализатора, будет выглядеть так:
func ConvertRGB(rgb RGBContainer) {
if rgb.R > 1 && rgb.G > 1 && rgb.B > 1 {
....
}
....
}
Анализатор производит сравнение блоков с учётом перестановки частей выражения относительно операторов. Ошибка будет обнаружена и в следующем примере кода:
if len([]rune(name)) > maxlength &&
maxlength < len([]rune(name)) {
....
}