go-tools
go-tools copied to clipboard
False positive with generic interface and generic type
-
The output of 'staticcheck -version' :
staticcheck.exe 2024.1.1 (0.5.1) -
The output of 'go version'
go version go1.23.0 windows/amd64 -
Exactly which command you ran
staticcheck main.go -
Output of the command and what's wrong with the output
main.go:31:2: field v is unused (U1000)
main.go:38:28: func (*genericStruct[T]).setValue is unused (U1000)
main.go:42:28: func (*genericStruct[T]).getValue is unused (U1000)
- Code (playground)
package main
import (
"fmt"
"reflect"
)
type valueHandler[T any] interface {
setValue(T)
getValue() T
}
type handler[T any] struct {
valueHandler[T]
}
func (h *handler[T]) setAndGetValue(v T) {
h.setValue(v)
va := h.getValue()
fmt.Println("Value is : ", va)
}
type genericStruct[T any] struct {
v T
}
func newGenericStruct[T any]() *genericStruct[T] {
return &genericStruct[T]{}
}
func (g *genericStruct[T]) setValue(v T) {
fmt.Println("setting value")
g.v = v
}
func (g *genericStruct[T]) getValue() T {
fmt.Println("getting value")
return g.v
}
func main() {
test := handler[int]{newGenericStruct[int]()}
test.setAndGetValue(1)
}
So staticcheck shows that functions setValue and getValue are not used. However we can see that messages of "setting value" and "getting value" appear. So they are clearly used. For me it seems like false positive.
I came here to submit a similar example. If the thing that staticcheck says is unused really was unused, then the program would still compile if it was removed, but it is not.
package somepkg
type wrapper[A any] interface {
call(a *A)
}
func Foo[A any, T any](set func(*A, T)) {
w := wrapper[A](&impl[A, T]{set: set})
w.call(nil)
}
type impl[A, T any] struct {
thisIsUsed T
set func(*A, T)
}
func (w *impl[A, T]) call(a *A) {
w.set(nil, w.thisIsUsed)
}