Может быть за пределами функции, см. Этот пример:
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()
вне их.
Таким образом, единственное место, где это разрешено, вне функций, которыеразрешено на верхнем уровне в объявлениях переменных.