Якщо в 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 має лише псевдоніми типу.