无法在声明之后导入



我试图在Go中的声明之后导入一些模块。

例如,我尝试在声明变量后导入时间,但这不起作用,有人能告诉我为什么在Go中会发生这种情况吗?

这项工作:

package main
import (
"fmt"
)
import "time";
var test = "testing"
func main() {
currtime := time.Now()
fmt.Println(test) 
fmt.Println(currtime)//Output: 16:44:53

}

但事实并非如此:

package main
import (
"fmt"
)
var test = "testing"
import "time"
func main() {
currtime := time.Now()
fmt.Println(test) 
fmt.Println(currtime)//Output: 16:44:53
}

错误为"函数体外部的非声明语句"。为什么围棋会出现这种情况?

错误为"函数体外的非声明语句"。为什么围棋会出现这种情况?

因为Go就是这样定义的。来自规格:

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

这意味着导入语句的唯一有效位置位于package子句与函数、类型、变量和常量的声明之间。

在您的情况下,您有一个变量声明,所以Go编译器知道将不再有导入语句。然后它会看到错误的import语句,看到它是一个非声明,并正确地生成您观察到的错误。

为什么在go lang中会发生这种情况?

因为语言规范不允许使用它。非常简单,还是?

在Go中导入包通常有两种方法:

import "fmt"
import "time" 

import (
"fmt"
"time"
)

诀窍是,不能将import和第二个示例中的其他内容混合使用。

package main
import (
"fmt"
)
var test = "testing" //<-- This does not comply with the definition of a Go file
import "time"
func main() {
currtime := time.Now()
fmt.Println(test) 
fmt.Println(currtime)//Output: 16:44:53
}

在这里,您可以找到一份关于.go文件解剖的文档。

每个.go文件的结构都是相同的。

  • 第一个是package子句,前面有注释,通常描述包的用途。

  • 然后零个或多个导入声明。

  • 第三部分包含零个或多个顶层声明

最新更新