我试图在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子句,前面有注释,通常描述包的用途。
然后零个或多个导入声明。
第三部分包含零个或多个顶层声明