В Go, если вы определяете новый тип, например:
type MyInt int
Затем вы не можете передать a MyInt
функции, ожидающей int, или наоборот:
func test(i MyInt) {
//do something with i
}
func main() {
anInt := 0
test(anInt) //doesn't work, int is not of type MyInt
}
Хорошо. Но почему тогда то же самое не относится к функциям? например:
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
}
Теперь я не жалуюсь, потому что это избавляет меня от необходимости явно приводить newfunc
тип MyFunc
, как в первом примере; это просто кажется непоследовательным. Я уверен, что для этого есть веская причина; кто-нибудь может просветить меня?
Причина, по которой я спрашиваю, в основном потому, что я хотел бы таким образом сократить некоторые из моих довольно длинных типов функций, но я хочу убедиться, что это ожидаемо и приемлемо :)
type
гораздо полезнее в Go, чем в Scala. Увы, в Scala есть только псевдонимы типов.