我正在尝试在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中会发生这种情况?
答案 0 :(得分:4)
错误是“函数主体外部的非声明语句”。为什么在Go中会发生这种情况?
因为这是Go的定义工作方式。来自the spec:
每个源文件都由一个package子句组成,该子句定义了它所属的package,其后是一组可能为空的导入声明,这些声明声明了要使用其内容的包,然后是一组可能为空的函数类型声明,变量和常量。
这意味着导入语句的 only 有效位置位于package
子句与函数,类型,变量和常量的声明之间。
在您的情况下,您有一个变量声明,因此Go编译器知道将不再有import语句。然后它会看到您的错误import语句,看到它是未声明的内容,并正确生成您观察到的错误。
答案 1 :(得分:2)
为什么在go lang中会发生这种情况?
因为语言规范不允许这样做。很简单,还是?
答案 2 :(得分:1)
通常,您可以通过两种方式在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文件Anatomy的完善文档。
每个.go文件的结构都相同。
第一个是package子句,可以选择在其后加上通常描述软件包目的的注释。
然后零个或多个导入声明。
第3部分包含零个或多个顶级声明