声明后无法导入

时间:2018-11-13 10:41:19

标签: go syntax

我正在尝试在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中会发生这种情况?

3 个答案:

答案 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部分包含零个或多个顶级声明

  •