Home > Article > Backend Development > Golang generics - cannot use type instead of same type when passing function pointer
I am new to golang and I am studying the following structure:
<code>type Flag[T any] struct { defaultValue interface{} } </code>
where T
can be int
or bool
I defined the following functions:
<code>func (f Flag[T]) GetVariation(val interface{}, getFunc func(v T) T ) T { inputVal := f.defaultValue.(T) return getFunc(inputVal) } </code>
When I try to use the above function for various data types such as bool, using the following:
<code>func (f Flag[bool]) GetBoolVariation(val bool) bool { return f.GetVariation(val, someFunc) } func someFunc(v bool) bool { return true } </code>
I receive the following error message:
cannot use someFunc (value of type func(v bool) bool) as func(v bool) bool value in argument to f.GetVariation
The message is very confusing because it says I can't use "X" as "X". Can you help me figure out what I'm doing wrong here?
First of all, it's hard to gauge your larger use case here, but generics might not be the best fit here since you're doing runtime type checking (For example f.defaultValue.(T)
).
Second, you appear to be using go 1.20
, which does produce a confusing error:
https://www.php.cn/link/63e8e3643e7f7198858eef325b0600f9
cannot use someFunc (value of type func(v bool) bool) as func(v bool) bool value in argument to f.GetVariation
Using the latest Playground version (go 1.21
as of this writing) gives a more detailed compilation error:
https://www.php.cn/link/2d1bcedd27b586d2a9562a0f8e076b41
./prog.go:14:29: cannot use someFunc (value of type func(v bool) bool) as func(v bool /* with bool declared at ./prog.go:13:14 */) bool /* with bool declared at ./prog.go:13:14 */ value in argument to f.GetVariation
Indicates the type bool
The specified position (./prog.go:13:14
) results from the type constraint.
Therefore, just because this type constraint bool
matches a non-generic function signature:
func someFunc(v bool) bool { return true }
does not mean it is an exact compilation match.
You can use this contrived example to "solve" compilation errors:
func someFuncFix[T any](v T) T { return v } func (f Flag[bool]) GetBoolVariation(val bool) bool { return f.GetVariation(val, someFuncFix[bool]) // FYI: `return f.GetVariation(val, someFuncFix)` also works as the bool constraint could be inferred }
But again, I think generics may not be the best solution for your specific use case.
The above is the detailed content of Golang generics - cannot use type instead of same type when passing function pointer. For more information, please follow other related articles on the PHP Chinese website!