Должен ли fmt.Println быть внутри функции в Go? - PullRequest
0 голосов
/ 09 мая 2019

Нужно ли fmt.Println всегда принадлежать функции?

Ранее использовали Python и это позволяет, но в ходе исследований кажется, что Java не

fmt.Println("can I do it?")

Возвращает:

синтаксическая ошибка: оператор без объявления вне тела функции

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

go всегда запускает выполнение в основной функции, поэтому fmt.Println () должен быть в главной функции или в функции, которая вызывается в главной.

0 голосов
/ 09 мая 2019

Может быть за пределами функции, см. Этот пример:

var n, err = fmt.Println("I can do it")

func main() {
    fmt.Println("In main(),", n, err)
}

Вывод (попробуйте на Go Playground ):

I can do it
In main(), 12 <nil>

(Выходные значения 12 <nil> - это значения, возвращаемые первым вызовом fmt.Println(), число записанных байтов и возвращенная ошибка, равная nil, указывающая на отсутствие ошибки.)

Также обратите внимание, что вам даже не нужно хранить возвращаемые значения fmt.Prinln(), вы можете использовать пустой идентификатор следующим образом:

var _, _ = fmt.Println("I can do it")

Он не может стоять насвое собственное на верхнем уровне "между" объявлениями верхнего уровня, но вышеупомянутое объявление переменной (с пустым идентификатором) в значительной степени достигает того же самого.

Spec: Организация исходного файла:

Каждый исходный файл состоит из предложения пакета, определяющего пакет, к которому он принадлежит, за которым следует возможно пустой набор объявлений импорта, которые объявляют пакеты, содержимое которых он хочет использовать, за которыми следует возможно пустой набор объявленийфункций,типы, переменные и константы.

SourceFile       = PackageClause ";" { ImportDecl ";" } { TopLevelDecl ";" } .

Очевидно, предложение пакета или объявление импорта не может содержать вызов fmt.Println(), и объявления верхнего уровня :

Declaration   = ConstDecl | TypeDecl | VarDecl .
TopLevelDecl  = Declaration | FunctionDecl | MethodDecl .

A объявление константы не может содержать вызов fmt.Println(), это не выражение константы.Объявление типа также не может содержать вызовы функций.

Объявление переменных может, как показано в примере вверху ответа.

Функция и объявления методов также могут вызывать fmt.Println(), но вы спрашивали, можно ли вызывать fmt.Println() вне их.

Таким образом, единственное место, где это разрешено, вне функций, которыеразрешено на верхнем уровне в объявлениях переменных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...