【问题标题】:Go package Global Variable usage within importsGo 包全局变量在导入中的使用
【发布时间】:2021-09-18 10:12:53
【问题描述】:

我正在创建一个包,该包将从我在 Go 中拥有的其他服务中调用。如果服务导入了这个包,并且这个包有全局变量,组件是否会将全局变量存储在自己的内存中?

所以如果我的包裹看起来像这样,

var global1 = ""
var global2 = ""
var global3 = ""
var global4 = ""

func setAllGlobalValues() error {
  // some logic that checks if globals are nil
  // if not setting it to a value after some computation.
  // returns nil or an actual error.
}

func DoesSomethingUsingGlobalVars() (bool, error) {
  // sets and uses the global vars.
  // Does some sort of computation and returns a bool, nil or nil,error
}

然后在服务中我会导入这个包并使用doesSomethingUsingGlobalVars 函数。 使用这个包的组件会将全局变量存储在自己的内存中吗?我现在无法用我的服务来测试它的设置方式,所以我很好奇是否有人知道。

从本质上讲,这是否可行,或者每次从导入此包的服务调用任何内容时,全局变量是否为零?

提前谢谢大家!

【问题讨论】:

  • “组件会将全局变量存储在自己的内存中”是什么意思?该变量将被保存在进程内存中所有变量的保存位置。包没有专用内存。

标签: go memory package components


【解决方案1】:

当您的程序导入此包时,将在您调用SetAllGlobalValues() 时设置全局值,稍后,当您调用DoesSomethingUsingGlobalVars() 时,这些值将已设置。请注意,这些函数名称的第一个字母必须大写,以便它们被导出并可供其他包使用。如果变量没有被导出,如你的代码 sn-p 所示,你将无法直接从调用者访问它们。

【讨论】:

  • 那么当我们setAllGlobalValues时,这会设置服务内存中的全局变量正确吗?
  • 是的,但请注意setAllGlobalValues 必须大写才能在包外访问。例如SetAllGlobalValues().
【解决方案2】:

您似乎在尝试重新发明对象。而不是你的代码,做 像这样:

package some
import "fmt"

type Thing struct {
   One string
   Two string
   Three string
   Four string
}

func NewThing() Thing {
   return Thing{"One", "Two", "Three", "Four"}
}

func (t Thing) Print() {
   fmt.Println(t.One, t.Two, t.Three, t.Four)
}

那么,当你调用NewThing时,“全局变量”只计算一次。

【讨论】:

  • 好!我的意思是让它大写,但是全局变量不需要在包之外访问,但我想知道它是否保存在导入这个包的服务的内存中?因此,如果我设置它一次,如果我去尝试调用DoesSomethingUsingGlobalVars 函数,它是否需要再次设置它(变量为零)还是保留该值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 2011-02-17
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
相关资源
最近更新 更多