Ваш вопрос правильно указывает на то, что любой метод является функцией. Однако язык Go должен уметь четко различать методы и функции. Причина этого в том, что методы имеют функции, которых нет у функций. Программист должен сделать выбор: Foo
- функция или метод.
Минимализм Go означает, что язык определяет только небольшой набор ключевых слов. Авторы Go могли бы выбрать новое ключевое слово, такое как method
, чтобы отличать методы от функций:
method Foo(receiver *T, arg1 int) {} // 'Foo' is a method, not a function
Оглядываясь на язык программирования Go, мы видим, что философия заключается в том, чтобы повторно использовать уже существующие ключевые слова, а не иметь отдельное ключевое слово для каждого случая. Ключевое слово for
является хорошим примером такого подхода:
for {} // Infinite loop
for a>0 {a--} // A while-do loop
for i := range channel {} // Receive values from a channel
for i:=0; i<N; i++ {} // C-style for loop
Основная идея состоит в том, что для синтаксического анализатора (и программистов на Go) для различения различных типов циклов for
нет необходимости вводить новое ключевое слово, если параметры можно различить по синтаксису следует после ключевого слова for
: ;
:=
range
identifier
..., их последовательного порядка и их наличия / отсутствия.
Ключевое слово func
следует той же схеме. Может использоваться в нескольких контекстах:
- определения функций:
func f() {}
- типы функций:
type F func(int) int
- определения методов:
func (t T) SomeMethod() {}
- закрытия:
{ ...; go func(){c<-1}(); ...}
С точки зрения минимализма, одно ключевое слово func
проще и элегантнее, чем наличие нескольких ключевых слов.
Список дополнительных параметров только для получателя
func (t *T) Foo(x int) {}
позволяет анализатору различать методы и функции:
func IDENTIFIER ... This is going to be a function
func ( ... This is going to be a method
Таким образом, синтаксический анализатор (как и программисты на Go) может проводить различие в зависимости от того, за ключевым словом func
следует идентификатор или (
.