我在“ config / config.go”中定义了一个init()函数
config.go
<div class="col-lg-9 col-md-6">
....
</div>
div class="col-lg-3 col-md-6">
...
</div>
我在身份验证包中还有一个名为auth.go的go文件
package config
import(
log "github.com/sirupsen/logrus"
)
func init() {
log.SetReportCaller(true)
}
在auth.go中调用log.Info()时,日志显示如下
package auth
import(
log "github.com/sirupsen/logrus"
)
func auth(username string, pwd string) {
//some auth code
log.Info("Auth success")
}
我在这里感到困惑的是,auth.go中的“ log”如何知道在2018-11-09T16:38:27+05:30 auth/auth.go:36 level=info msg="Auth success"
中完成的设置。 config.go
位于log.SetReportCaller()
中,但是即使记录了config.go
,它也需要进行log.SetReportCaller()的设置,该设置是在config.go中完成的。
由于未在auth.go中设置log.SetReportCaller(),因此预期日志应如下所示,而不显示调用方方法的行号。
auth.go
main.go
2018-11-09T16:38:27+05:30 level=info msg="Auth success"
auth / router.go
package main
import (
"path/to/auth"
log "github.com/sirupsen/logrus"
"net/http"
)
func main() {
r := server.Route()
log.Info("Listening on 8080")
http.Handle("/", r)
log.Fatal(http.ListenAndServe(":8080", nil))
}
auth / login.go
package auth
import (
"github.com/gorilla/mux"
"github.com/rs/cors"
"net/http"
)
func Route() http.Handler {
r := mux.NewRouter()
// UI handlers
r.HandleFunc("/", IndexPageHandler)
r.HandleFunc("/login", LoginHandler).Methods("POST")
handler := cors.Default().Handler(r)
return
}
请解释这是怎么发生的
答案 0 :(得分:4)
检查此图以了解init()
的工作方式:diagram
初始化顺序如下
如果一个软件包导入了其他软件包,则首先初始化导入的软件包。
然后初始化包装级别变量。
init函数。程序包可以具有多个init函数(在单个文件中或分布在多个文件中),并且按照将其呈现给编译器的顺序进行调用。
您将找到一个解释此here的示例。
我怀疑在依赖关系树中,有一个共同的祖先文件同时导入config
包和auth
包。
以下是初始化的官方文档:Package initialization
UPD::添加了各自的代码后,我们可以直观地看到这里发生的情况。看下面的图片,
发生了什么事
log.SetReportCaller(true)
)。main()
函数开始执行... 答案 1 :(得分:1)
您要询问的行为实际上与init()
函数的工作方式无关。 SetReportCaller
在github.com/sirupsen/logrus
中而不是在config
或auth
包中设置全局变量。因此,在何处调用该函数或在何处调用log.Info
等都无关紧要;该设置会影响所有对数呼叫的呼叫,无论呼叫来源如何。