Golang generics - cannot use type instead of same type when passing function pointer

PHPz
Release: 2024-02-06 10:33:03
forward
525 people have browsed it

Golang 泛型 - 在传递函数指针时不能使用类型代替相同类型

Question content

I am new to golang and I am studying the following structure:

<code>type Flag[T any] struct {
    defaultValue interface{}
}
</code>
Copy after login

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>
Copy after login

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>
Copy after login

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
Copy after login

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?


Correct Answer


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
Copy after login

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
Copy after login

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
}
Copy after login

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
}
Copy after login

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!

Related labels:
source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template