go-staticcheck循环中strings.HasPrefix返回值未使用告警问题咨询
Go StaticCheck SA4017告警的特殊场景分析
StaticCheck的SA4017告警(提示「HasPrefix is a pure function but its return value is ignored」)会在循环内的特定场景下触发,具体规则和案例如下:
无告警场景
当循环内使用strings.HasPrefix配合fmt.Println时,不会触发告警:
for _, key := range []string{"my-foo", "bar", "baz"} { if strings.HasPrefix(key, "my") { fmt.Println(true) } }
触发告警场景
将fmt.Println替换为continue后,立刻触发SA4017告警:
for _, key := range []string{"my-foo", "bar", "baz"} { if strings.HasPrefix(key, "my") { continue } }
告警内容:HasPrefix is a pure function but its return value is ignored
特殊点说明
- 该问题仅针对
strings.HasPrefix配合continue的场景,使用strings.Contains时不会出现相同告警。 - 如果把
strings.HasPrefix的返回值赋值给变量再做判断,会触发两个告警:「this value of hasMy is never used」和「HasPrefix is a pure function but its return value is ignored」,代码示例:
for _, key := range []string{"my-foo", "bar", "baz"} { hasMy := strings.HasPrefix(key, "my") if hasMy { continue } }
临时解决方法
如果需要忽略该告警,可以使用注释直接禁用SA4017规则(注意//lint和冒号之间无空格):
for _, key := range []string{"my-foo", "bar", "baz"} { //lint:ignore SA4017 // ignore this if strings.HasPrefix(key, "my") { continue } }
内容的提问来源于stack exchange,提问作者Bhojendra Rauniyar
相关产品推荐
相关产品推荐

