如何访问全局变量

Posted

技术标签:

【中文标题】如何访问全局变量【英文标题】:How to access global variables 【发布时间】:2016-05-04 11:50:14 【问题描述】:

如何访问在不同 .go 包/文件中的 main.go 中声明/init 的变量?一直告诉我变量未定义(我知道全局变量不好,但这只是用作时间戳

在 main.go 中

var StartTime = time.Now()
func main()...

尝试在不同的 .go 文件中访问 StartTime 但不断得到未定义的 StartTime

【问题讨论】:

go build works fine but go run fails的可能重复 变量名的首字母大写吗? 是的,大写,我的go build失败 嗯,也许将变量“注入”到另一个包中会更好,例如,你不能在你的主包的main方法中设置另一个包中的变量吗?如果你通过引用传递它,那么变量仍然是共享的...... @Nighthee: 是的,因为您没有将 main 导入到另一个包中,所以它不存在(既因为您不能有循环依赖,也因为您可以'不要导入 main 包。) 【参考方案1】:

我会改为“注入”starttime 变量,否则你的包之间会存在循环依赖关系。

main.go

var StartTime = time.Now()
func main() 
   otherPackage.StartTime = StartTime

otherpackage.go

var StartTime time.Time

【讨论】:

你不是重新声明变量吗? 我认为如果您将除一个变量之外的所有变量声明为指针并进行地址分配注入,那么在内存使用方面而不是双重声明变量方面会更好。【参考方案2】:

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

package dif

import (
    "time"
)

var StartTime = time.Now()

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

package main

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

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

输出:

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

文件目录结构:

folder
  main.go
  dif
    dif.go

有效!

【讨论】:

我的'dif'是一个restful API,在程序启动时不会被调用,但只有在通过URL调用时才会被调用,所以我需要将StartTime放在main.go中并将其传递给dif ,您正在将它从 diff 传递到 main,不过感谢您的尝试! 更好的方法是使用函数,而不是变量,只需将其设为函数,每当调用它时,您都会获得时间戳。【参考方案3】:

我建议使用通用的导入方式。

首先我将解释它称为“相对导入”的方式可能会导致一些错误

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

第一:

在 go 版本 >= 1.12 中,有一些关于导入文件的新提示和一些更改。

1- 你应该把你的文件放在另一个文件夹中,例如我在“model”文件夹中创建一个文件,文件名是“example.go”

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

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

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

文件目录是:

root
|_____main.go
|_____model
          |_____example.go

这是一个例子。去:

package model

import (
    "time"
)

var StartTime = time.Now()

这是 main.go,当你想导入一个文件时你应该​​使用大写。 “Mod”以大写开头

package main

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

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

注意!!!

注意:我不推荐这种类型的导入!

第二个:

(正常导入)

导入文件的更好方法是:

你的结构应该是这样的:

root
|_____github.com
         |_________Your-account-name-in-github
         |                |__________Your-project-name
         |                                |________main.go
         |                                |________handlers
         |                                |________models
         |               
         |_________gorilla
                         |__________sessions

这是一个例子:

package main

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

func main()
     //you can use sessions here

所以你可以在任何你想要的地方导入“github.com/gorilla/sessions”......只需导入它。

【讨论】:

以上是关于如何访问全局变量的主要内容,如果未能解决你的问题,请参考以下文章

如何全局访问 AJAX 定义的变量? [复制]

如何在 Python 中的多处理期间访问全局变量 [重复]

mfc怎么设置全局变量

如何通过 Python 和 ctype 访问 C 全局变量结构

如何从 canvas.onmousemove 函数外部访问全局变量?

JS中全局变量和window自定义属性的区别