使用不同的模块

时间:2017-12-07 07:28:55

标签: go

我的项目如下所示:

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.goutils2.go中也使用相同的实例 而是在每个模块上创建一个新模块(稍后我会调用helper中的某个功能和util内的server->main.go 我该怎么做才打高尔夫?

2 个答案:

答案 0 :(得分:1)

不推荐在软件包之间共享对象,因为在出​​现问题时很可能会弄乱。调试并找出调用或变异obj的位置将变得困难。相反,请尝试将obj作为参数传递给helper1utils2

如果您确实想要共享该对象,请将名称更改为以大写字母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可以为您做。