На этом шаге рассмотрим синтаксис пользовательской функции в Go.
Функции являются основой процедурного программирования, и язык Go обеспечивает самую широкую их поддержку. Приведем фундаментальный синтаксис определения функции:
func имяФункции(необязательныеПараметры) типНеобязательногоВозвращаемогоЗначения { тело } func имяФункции(необязательныеПараметры) (необязательныеоВозвращаемыеЗначения) { тело }
Функция может принимать нуль или более параметров. Если функция не имеет параметров, должны указываться пустые круглые скобки. Если функция имеет один или более параметров, они должны записываться в форме списка:
параметры1 тип1, ..., параметрыN типN,
где параметры1 – имя единственного параметра или список из двух или более имен параметров указанного типа, разделенных запятыми.
Имени типа самого последнего параметра может предшествовать многоточие (...). Такие функции называют функциями с переменным числом аргументов, то есть функциями, способными принимать нуль или более значений указанного типа в виде значения параметра. Внутри функции такой параметр будет иметь тип []Тип.
Функция может возвращать нуль или более значений. Если функция ничего не возвращает, сразу вслед за круглой скобкой, закрывающей список параметров, должна следовать открывающая фигурная скобка. Если функция имеет одно неименованное возвращаемое значение, должен быть указан его тип. Если функция имеет два или более неименованных возвращаемых значения, их типы должны быть перечислены в круглых скобках, в форме списка:
(тип1, ..., типN).
Если функция имеет одно или более именованных возвращаемых значений, они должны быть перечислены в круглых скобках, в форме списка:
(значения1 тип1, ..., значенияN типN),
где значения1 – единственное имя возвращаемого значения или список из двух или более имен возвращаемых значений, разделенных запятыми, указанного типа. Возвращаемые значения функции могут быть либо все именованные, либо все неименованные – смешивать их не допускается.
Функция, имеющая одно или более возвращаемых значений, должна содержать хотя бы одну инструкцию return или вызывать функцию panic() в последней инструкции. Если возвращаемые значения не имеют имен, инструкция return должна включать список всех возвращаемых значений соответствующих типов. Если возвращаемые значения имеют имена, инструкция return может включать список возвращаемых значений, подобно случаю с неименованными возвращаемыми значениями, либо вообще быть пустой (то есть без списка возвращаемых значений). Несмотря на допустимость пустых инструкций return, использовать их не рекомендуется.
Если функция имеет одно или более возвращаемых значений, последней выполняемой инструкцией в ней должна быть инструкция return или вызов функции panic(). Компиляторы Go способны распознать, когда функция завершается аварийно и потому не сможет выполнить инструкцию return.
На следующем шаге рассмотрим использование значений, возвращаемых функцией, в качестве аргументов других функций.