Home  >  Article  >  Backend Development  >  Golang generics - cannot use type instead of same type when passing function pointer

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

PHPz
PHPzforward
2024-02-06 10:33:03467browse

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

Question content

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?


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

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!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete