Dans Go, si vous définissez un nouveau type, par exemple:
type MyInt int
Vous ne pouvez pas alors passer a MyInt
à une fonction qui attend un int, ou vice versa:
func test(i MyInt) {
//do something with i
}
func main() {
anInt := 0
test(anInt) //doesn't work, int is not of type MyInt
}
Bien. Mais pourquoi est-ce alors que la même chose ne s'applique pas aux fonctions? par exemple:
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
}
Maintenant, je ne me plains pas parce que cela m'évite d'avoir à faire un cast explicitement en newfunc
type MyFunc
, comme je devrais le faire dans le premier exemple; cela semble simplement incohérent. Je suis sûr qu'il y a une bonne raison à cela; quelqu'un peut-il m'éclairer?
La raison pour laquelle je pose la question est principalement parce que je voudrais raccourcir certains de mes types de fonctions plutôt longs de cette manière, mais je veux m'assurer que cela est attendu et acceptable :)
type
est plutôt plus utile dans Go que Scala. Scala n'a que des alias de type, hélas.