En Go, si define un nuevo tipo, por ejemplo:
type MyInt int
Entonces no puede pasar un MyInt
a 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 newfunc
para 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 :)
type
es bastante más útil en Go que en Scala. Scala solo tiene alias de tipo, por desgracia.