One of our go app crashed recently because of a bug in https://github.com/urfave/cli/, here is the PR with fix from my collegue who found the issue. Then we started talking about it internally and found something that’s interesting. I understand some of it but not fully so I thought of asking people who might know.
My question is why bar works but not foo.
package main
import (
	"fmt"
)
func main() {
	var f interface{}
	var b interface{}
	f = foo()
	b = bar()
	if _, ok := f.(func(string) error); ok {
		fmt.Println("FOUND IT")
	} else {
		fmt.Println("DIDNT FIND IT")
	}
	if _, ok := b.(func(string) error); ok {
		fmt.Println("FOUND IT")
	} else {
		fmt.Println("DIDNT FIND IT")
	}
}
type FooFunc func(string) error
func foo() func(string) error {
	return func(e string) error {
		return fmt.Errorf("GOTCHA")
	}
}
func bar() FooFunc {
	return func(e string) error {
		return fmt.Errorf("GOTCHA")
	}
}