In Go, se si definisce un nuovo tipo, ad esempio:
type MyInt int
Non puoi quindi passare a MyInta 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
}
Bene. Ma perché allora 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 evita di dover cast esplicitamente newfuncper digitare MyFunc, come avrei dovuto fare nel primo esempio; sembra solo incoerente. Sono sicuro che ci sia 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 assicurarmi che sia previsto e accettabile farlo :)
typeè piuttosto più utile in Go che in Scala. Scala ha solo alias di tipo, ahimè.