Главное различие между этими двумя формами заключается в том, что они отличаются не только синтаксисом, но и семантикой :
- «Нормальная» форма, в которой используется
func name (...)
form создает обычную именованную функцию. - То, что вы называете «создать функцию, используя
var
», фактически создает так называемую анонимную функцию и присваивает ее значение переменной.
Разница в том, что в Go анонимные функции ведут себя как замыкания, , а обычные функции - нет.
Закрытие - это функция, которая "захватывает" любые переменные из своей внешней лексической области видимости, которыеиспользуется в теле функции (хотя она не затеняется локальными переменными и аргументами функции).
Различие может быть неочевидным, когда любая из форм используется на верхнем уровне пакета, то есть вне какой-либотело функции, - поскольку внешняя область в этом случае является глобальными переменными пакета, но внутри других функций различие очевидно:«нормальная» форма просто не может быть использована.
Другое отличие состоит в том, что вы можете заменить значение в переменной, содержащей значение функции, в то время как вы не можете сделать то же самое с нормальной функцией.
Тем не менее, если мы говорим о коде верхнего уровня, предложение, предложенное Flimzy, справедливо: в рабочем коде Go наличие глобальных переменных, содержащих значения функций, - это запах кода с до , что может быть доказано иначе.