首页 > 解决方案 > fmt.Println 必须在 Go 中的函数内吗?

问题描述

fmt.Println需要总是属于一个函数吗?

以前使用过 Python 并且它允许它,但在研究中,Java 似乎没有

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

回报:

语法错误:函数体外的非声明语句

标签: gosyntaxgrammar

解决方案


它可能在函数之外,请参见以下示例:

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")

它不能独立存在于顶级“介于”顶级声明之间,但上面的变量声明(带有空白标识符)几乎可以实现相同的效果。

规范:源文件组织:

每个源文件都包含一个包子句,定义它所属的包,然后是一组可能为空的导入声明,用于声明它希望使用其内容的包,然后是一组可能为空的函数、类型、变量声明,和常数。

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

显然,包子句导入声明不能包含fmt.Println()调用,并且顶级声明

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

常量声明不能包含调用fmt.Println(),这不是常量表达式类型声明也不能包含函数调用。

变量声明可以,如答案顶部的示例所示。

函数方法声明也可以调用fmt.Println(),但您特别询问是否fmt.Println()可以在它们之外调用。

因此,在顶层允许的函数之外唯一允许的地方是在变量声明中。


推荐阅读