fmt.Println是否必须在Go中的函数内?

时间:2019-05-09 06:21:10

标签: go syntax grammar

fmt.Println是否必须始终属于一个函数?

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

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

返回:

  

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

2 个答案:

答案 0 :(得分:0)

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

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()的返回值,可以像这样使用blank identifier

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

它不能独自位于顶层声明之间的顶层,但是上面的变量声明(带有空白标识符)几乎可以达到相同的目的。

Spec: Source file organization:

  

每个源文件都由一个package子句组成,该子句定义了它所属的package,其后是一组可能为空的导入声明,这些声明声明了要使用其内容的包,然后是一组可能为空的函数类型声明,变量和常量。

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

很显然,package clauseimport declaration不能包含fmt.Println()呼叫,并且top level declarations

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

constant declaration不能包含fmt.Println()的呼叫,不是constant expressiontype declaration也不能包含函数调用。

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

Functionmethod declarations也可以呼叫fmt.Println(),但是您在问是否可以在它们之外调用fmt.Println()

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

答案 1 :(得分:0)

总是在主函数中开始执行,因此fmt.Println()必须在主函数或在main中调用的函数中。