En Go, si define un nuevo tipo, por ejemplo:
type MyInt int
Entonces no puede pasar un MyInta una función esperando 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
}
Multa. Pero, ¿por qué entonces no se aplica lo mismo a las funciones? p.ej:
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
}
Ahora, no me quejo porque me ahorra tener que lanzar explícitamente newfuncpara escribir MyFunc, como tendría que hacer en el primer ejemplo; simplemente parece inconsistente. Estoy seguro de que hay una buena razón para ello; ¿Alguien puede iluminarme?
La razón por la que pregunto es principalmente porque me gustaría acortar algunos de mis tipos de funciones bastante largos de esta manera, pero quiero asegurarme de que sea esperado y aceptable para hacer esto :)
typees bastante más útil en Go que en Scala. Scala solo tiene alias de tipo, por desgracia.