Perché posso digitare funzioni alias e usarle senza eseguire il cast?

In Go, se si definisce un nuovo tipo, ad esempio:

type MyInt int 

Non è quindi ansible passare un MyInt a una funzione che si aspetta un int, o viceversa:

 func test(i MyInt) { //do something with i } func main() { anInt := 0 test(anInt) //doesn't work, int is not of type MyInt } 

Belle. Ma perché è allora che lo stesso non si applica alle funzioni? per esempio:

 type MyFunc func(i int) func (m MyFunc) Run(i int) { m(i) } func run(f MyFunc, i int) { f.Run(i) } func main() { var newfunc func(int) //explicit declaration newfunc = func(i int) { fmt.Println(i) } run(newfunc, 10) //works just fine, even though types seem to differ } 

Ora, non mi lamento perché mi salva dover castare in modo esplicito newfunc per digitare MyFunc , come dovrei fare nel primo esempio; sembra solo incoerente. Sono sicuro che c’è una buona ragione per questo; qualcuno può illuminarmi?

Il motivo per cui lo chiedo è principalmente perché vorrei accorciare alcuni dei miei tipi di funzione piuttosto lunghi in questo modo, ma voglio essere certo che sia previsto e accettabile farlo 🙂