我的项目如下所示:
myproj
src
server
main.go
helpres
helper1.go
helpr2.go
utils
utils1.go
utils2.go
这是main.go函数中的代码
import “myproj/utils”
import “myproj/helpers”
var log obj *obj
func init() {
log = initLog()
util.passLog(log)
helper.passLog(log)
//And then helper and util can use it ...is it the right way to do it ?
}
func main(){
log.write()
}
现在我可以在server -> main.go
内使用obj1,
但是我想在helper1.go
和utils2.go
中也使用相同的实例
而是在每个模块上创建一个新模块(稍后我会调用helper
中的某个功能和util
内的server->main.go
我该怎么做才打高尔夫?
答案 0 :(得分:1)
不推荐在软件包之间共享对象,因为在出现问题时很可能会弄乱。调试并找出调用或变异obj
的位置将变得困难。相反,请尝试将obj
作为参数传递给helper1
和utils2
。
如果您确实想要共享该对象,请将名称更改为以大写字母Obj
开头。这样变量就从包中导出,可以从其他地方使用。请注意,这会向所有想要抓住它并且(误)使用它的人展示Obj
。
编辑:
将obj
传递给帮助者中的函数:
helper.doSomethingHelpfulWith(obj)
答案 1 :(得分:0)
在模块之间共享对象不是很好的方法。在您的示例中,您尝试初始化Logger。查看GO内置包log的实现。而是为其余的模块提供Api。
但一般方法是这样的:
// Assume this is your logging tools package "internal/tools/logging"
package logging
// First you create local object reference in your logger source file:
var logger = NewLoggerInstance()
// Then you provide global api to use this local reference
func Configure(c Myconfig) { std = NewSpecialInstanceFromConfig(c) }
// Then you can provide actual functionality for other modules as part of Api
func Debug(args ...interface{}) {
std.Debug(args...) // this will cal method of your internal logger reference stored in variable std
}
// Then other modules just import your package
import <PREFIX>/internal/tools/logging
// And use it like this
c := LoadConfigFromEnvironment()
logging.Configure(c)
logging.Debug("Debug log")
logging.Info("something else")
绝对看看这个项目template。
编辑:
Configure()
方法的示例。
package logging
// lets assume we have package config included, it contains a struct of our application config
func Configure(c config.Config){
// new logger instance
l := NewLoggerInstance()
// check value from config
if c.GetJsonLogFormat() {
l.SetFormatter(JsonFormater{})
}
// some other settings
l.SetSomething(c.GetSomething())
// set global package variable
logger = l
}
从环境加载配置this可以为您做。