如何在其他.go包/文件中的main.go中访问已声明/初始化的变量? 不断告诉我变量未定义(我知道全局变量不好,但这只是用作时间戳记)

在main.go中

1
2
var StartTime = time.Now()
func main(){...}

尝试访问其他.go文件中的StartTime
但请保持未定义StartTime

  • Go构建的可能重复工作正常,但Go运行失败
  • 变量名称的第一个字母是否大写?
  • 是的,它大写,我的构建失败
  • 您在运行程序时包括所有相关文件吗?也就是说,在运行代码时,您是否要运行file1.go file2.go ..etc
  • 是的,为了更加简洁,我在main.go中有一个名为var StartTime = time.Now()的变量,但是当我尝试在同一目录的不同.go中访问StartTime时,它说未定义,我是否可以在要尝试的.go文件中包含" main"?
  • 嗯,也许最好将变量"注入"到另一个包中,例如,您是否可以使用主包的main方法在另一个包中设置变量?如果通过引用传递它,则该变量仍将共享...
  • 不幸的是,由于我们整个系统的构建方式,我无法做到这一点。我认为如果它是全局的,那么所有文件都可以访问它,但是我想go不会让你这样做
  • 否则,您可能会有一个循环引用。您的main.go软件包依赖于" otherPackage",现在您想使" otherPackage"依赖于主软件包。
  • 好的,我做了更改,现在main在我的src目录中,然后在src中有一个名为timeStamp的目录,其中包含另一个.go文件,但仍给我相同的StartTime未定义
  • @Nighthee:是的,因为您没有将main导入到另一个包中,所以它在那里不存在(两者都是因为您不能具有循环依赖关系,并且因为您不能导入main包。)

我将改为"注入" starttime变量,否则在软件包之间会有循环依赖关系。

main.go

1
2
3
4
var StartTime = time.Now()
func main() {
   otherPackage.StartTime = StartTime
}

otherpackage.go

1
var StartTime time.Time
  • 您没有重新声明变量吗?

我创建一个包含您的代码的文件dif.go

1
2
3
4
5
6
7
package dif

import (
   "time"
)

var StartTime = time.Now()

在文件夹之外,创建我的main.go,没关系!

1
2
3
4
5
6
7
8
9
10
package main

import (
    dif"./dif"
   "fmt"
)

func main() {
    fmt.Println(dif.StartTime)
}

输出:

1
2016-01-27 21:56:47.729019925 +0800 CST

文件目录结构:

1
2
3
4
folder
  main.go
  dif
    dif.go

有用!

  • 我的dif是一个宁静的API,仅在通过URL调用程序时才会调用它,因此我需要将StartTime放入main.go中并将其传递给dif,您将其从dif传递给main,谢谢 虽然尝试!
  • 更好的方法是使用函数而不是变量,只需使其成为一个函数,只要调用该函数,便会获得一个时间戳。

我建议使用常见的导入方式。

首先,我将解释它称为"相对导入"的方式,也许是这种方式导致某些错误

其次,我将解释常见的导入方式。

第一:

在Go版本> = 1.12中,有一些有关导入文件的新提示,并且有些更改。

1-您应该将文件放在另一个文件夹中,例如,我在"模型"文件夹中创建了一个文件,文件名为" example.go"

2-要导入文件时必须使用大写字母!

3-使用大写字母表示要导入其他文件的变量,结构和函数

注意:无法将main.go导入另一个文件。

文件目录是:

1
2
3
4
root
|_____main.go
|_____model
          |_____example.go

这是一个example.go:

1
2
3
4
5
6
7
package model

import (
   "time"
)

var StartTime = time.Now()

这是main.go,要导入文件时应使用大写字母。" Mod"以大写字母开头

1
2
3
4
5
6
7
8
9
10
package main

import (
    Mod"./model"
   "fmt"
)

func main() {
    fmt.Println(Mod.StartTime)
}

注意!!!

注意:我不建议这种类型的导入!

第二:

(正常导入)

导入文件的更好方法是:

您的结构应如下所示:

1
2
3
4
5
6
7
8
9
10
root
|_____github.com
         |_________Your-account-name-in-github
         |                |__________Your-project-name
         |                                |________main.go
         |                                |________handlers
         |                                |________models
         |              
         |_________gorilla
                         |__________sessions

这是一个示例:

1
2
3
4
5
6
7
8
9
package main

import (
   "github.com/gorilla/sessions"
)

func main(){
     //you can use sessions here
}

因此您可以在每个想要的位置导入" github.com/gorilla/sessions" ...只需导入即可。