How golang's init() works. I am confused
up vote
-5
down vote
favorite
I have a init() function defined in "config/config.go"
config.go
package config
import(
log "github.com/sirupsen/logrus"
)
func init()
log.SetReportCaller(true)
I have another go file called auth.go in auth package
package auth
import(
log "github.com/sirupsen/logrus"
)
func auth(username string, pwd string)
//some auth code
log.Info("Auth success")
When log.Info() is called in auth.go the log prints as below
2018-11-09T16:38:27+05:30 auth/auth.go:36 level=info msg="Auth success"
What I am confused here is that, how "log" in auth.go is aware of the settings done in config.go
. log.SetReportCaller()
is in config.go
but even when auth.go
is logged it takes settings of log.SetReportCaller() done in config.go
Since log.SetReportCaller() is not set in auth.go expected log should be as below without showing line number of caller method.
2018-11-09T16:38:27+05:30 level=info msg="Auth success"
main.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/router.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
auth/login.go
package auth
import (
"fmt"
"path/to/config"
log "github.com/sirupsen/logrus"
"net/http"
)
func LoginHandler(w http.ResponseWriter, r *http.Request)
username := r.FormValue("username")
password := r.FormValue("password")
status, userName, mail, _ := auth(username, password)
//some code goes here
Kindly explain how this is happening
go
add a comment |
up vote
-5
down vote
favorite
I have a init() function defined in "config/config.go"
config.go
package config
import(
log "github.com/sirupsen/logrus"
)
func init()
log.SetReportCaller(true)
I have another go file called auth.go in auth package
package auth
import(
log "github.com/sirupsen/logrus"
)
func auth(username string, pwd string)
//some auth code
log.Info("Auth success")
When log.Info() is called in auth.go the log prints as below
2018-11-09T16:38:27+05:30 auth/auth.go:36 level=info msg="Auth success"
What I am confused here is that, how "log" in auth.go is aware of the settings done in config.go
. log.SetReportCaller()
is in config.go
but even when auth.go
is logged it takes settings of log.SetReportCaller() done in config.go
Since log.SetReportCaller() is not set in auth.go expected log should be as below without showing line number of caller method.
2018-11-09T16:38:27+05:30 level=info msg="Auth success"
main.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/router.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
auth/login.go
package auth
import (
"fmt"
"path/to/config"
log "github.com/sirupsen/logrus"
"net/http"
)
func LoginHandler(w http.ResponseWriter, r *http.Request)
username := r.FormValue("username")
password := r.FormValue("password")
status, userName, mail, _ := auth(username, password)
//some code goes here
Kindly explain how this is happening
go
can you show the file where yourmain
function is. I am suspecting that file importsconfig
package.
– Emruz Hossain
2 days ago
question is updated with main.go code
– Aditya C S
2 days ago
2
We can't see the dependency tree so I'm guessingconfig
is a dependency somewhere here. if that is the case, it is not mystery why theinit()
function is called.
– ssemilla
2 days ago
add a comment |
up vote
-5
down vote
favorite
up vote
-5
down vote
favorite
I have a init() function defined in "config/config.go"
config.go
package config
import(
log "github.com/sirupsen/logrus"
)
func init()
log.SetReportCaller(true)
I have another go file called auth.go in auth package
package auth
import(
log "github.com/sirupsen/logrus"
)
func auth(username string, pwd string)
//some auth code
log.Info("Auth success")
When log.Info() is called in auth.go the log prints as below
2018-11-09T16:38:27+05:30 auth/auth.go:36 level=info msg="Auth success"
What I am confused here is that, how "log" in auth.go is aware of the settings done in config.go
. log.SetReportCaller()
is in config.go
but even when auth.go
is logged it takes settings of log.SetReportCaller() done in config.go
Since log.SetReportCaller() is not set in auth.go expected log should be as below without showing line number of caller method.
2018-11-09T16:38:27+05:30 level=info msg="Auth success"
main.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/router.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
auth/login.go
package auth
import (
"fmt"
"path/to/config"
log "github.com/sirupsen/logrus"
"net/http"
)
func LoginHandler(w http.ResponseWriter, r *http.Request)
username := r.FormValue("username")
password := r.FormValue("password")
status, userName, mail, _ := auth(username, password)
//some code goes here
Kindly explain how this is happening
go
I have a init() function defined in "config/config.go"
config.go
package config
import(
log "github.com/sirupsen/logrus"
)
func init()
log.SetReportCaller(true)
I have another go file called auth.go in auth package
package auth
import(
log "github.com/sirupsen/logrus"
)
func auth(username string, pwd string)
//some auth code
log.Info("Auth success")
When log.Info() is called in auth.go the log prints as below
2018-11-09T16:38:27+05:30 auth/auth.go:36 level=info msg="Auth success"
What I am confused here is that, how "log" in auth.go is aware of the settings done in config.go
. log.SetReportCaller()
is in config.go
but even when auth.go
is logged it takes settings of log.SetReportCaller() done in config.go
Since log.SetReportCaller() is not set in auth.go expected log should be as below without showing line number of caller method.
2018-11-09T16:38:27+05:30 level=info msg="Auth success"
main.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/router.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
auth/login.go
package auth
import (
"fmt"
"path/to/config"
log "github.com/sirupsen/logrus"
"net/http"
)
func LoginHandler(w http.ResponseWriter, r *http.Request)
username := r.FormValue("username")
password := r.FormValue("password")
status, userName, mail, _ := auth(username, password)
//some code goes here
Kindly explain how this is happening
go
go
edited yesterday
asked 2 days ago
Aditya C S
130128
130128
can you show the file where yourmain
function is. I am suspecting that file importsconfig
package.
– Emruz Hossain
2 days ago
question is updated with main.go code
– Aditya C S
2 days ago
2
We can't see the dependency tree so I'm guessingconfig
is a dependency somewhere here. if that is the case, it is not mystery why theinit()
function is called.
– ssemilla
2 days ago
add a comment |
can you show the file where yourmain
function is. I am suspecting that file importsconfig
package.
– Emruz Hossain
2 days ago
question is updated with main.go code
– Aditya C S
2 days ago
2
We can't see the dependency tree so I'm guessingconfig
is a dependency somewhere here. if that is the case, it is not mystery why theinit()
function is called.
– ssemilla
2 days ago
can you show the file where your
main
function is. I am suspecting that file imports config
package.– Emruz Hossain
2 days ago
can you show the file where your
main
function is. I am suspecting that file imports config
package.– Emruz Hossain
2 days ago
question is updated with main.go code
– Aditya C S
2 days ago
question is updated with main.go code
– Aditya C S
2 days ago
2
2
We can't see the dependency tree so I'm guessing
config
is a dependency somewhere here. if that is the case, it is not mystery why the init()
function is called.– ssemilla
2 days ago
We can't see the dependency tree so I'm guessing
config
is a dependency somewhere here. if that is the case, it is not mystery why the init()
function is called.– ssemilla
2 days ago
add a comment |
2 Answers
2
active
oldest
votes
up vote
3
down vote
accepted
Check this diagram to understand how init()
work: diagram
Initialization order are as follows,
If a package imports other packages, the imported packages are initialised first.
Package level variables are initialised then.
init function of current package is called next. A package can have multiple init functions (either in a single file or distributed across multiple files) and they are called in the order in which they are presented to the compiler.
You will found an example explaining this here.
I am suspecting in dependency tree, there is a common ancestor file that import both config
package and auth
package.
Here is official doc on initialization: Package initialization
UPD: As you have added respective codes, let's visualize what is happening here. Look at the picture bellow,
What happening:
- Your main package start initialing. But it is has imported auth package. So to complete initialization, auth package must be initialized.
auth package start initializing. But it has imported config package. So to complete initialization, config package must be initialized.
config package complete initialization(log.SetReportCaller(true)
is called).
auth package complete initialization.
main package complete initialization.main()
function starts executing...
@peterSO thank you for pointing me there. I have updated my answer to include this information.
– Emruz Hossain
2 days ago
I have added all the dependent code. Kindly refer the edited question and throw me some light on how dependency is working here.
– Aditya C S
yesterday
@AdityaCS I have updated my answer to explain what is happening.
– Emruz Hossain
yesterday
thanks for the explanation. Still my doubt is, is the "log" package imported and referenced in main.go the same as "log" imported and referenced in config.go. Both imports has different "log" reference right? How it still works?
– Aditya C S
yesterday
1
@Adrian has already answer this in his answer. "SetReportCaller
sets a global variable in github.com/sirupsen/logrus" . All imports from different packages refers to same instance until you create new one usinglogrus.New()
– Emruz Hossain
yesterday
add a comment |
up vote
1
down vote
The behavior you're asking about actually has nothing to do with how init()
functions work. SetReportCaller
sets a global variable in github.com/sirupsen/logrus
, not in your config
or auth
packages. So it doesn't matter where you call that function or where you call log.Info
et al; the setting affects all calls to logrus regardless of call origin.
add a comment |
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
3
down vote
accepted
Check this diagram to understand how init()
work: diagram
Initialization order are as follows,
If a package imports other packages, the imported packages are initialised first.
Package level variables are initialised then.
init function of current package is called next. A package can have multiple init functions (either in a single file or distributed across multiple files) and they are called in the order in which they are presented to the compiler.
You will found an example explaining this here.
I am suspecting in dependency tree, there is a common ancestor file that import both config
package and auth
package.
Here is official doc on initialization: Package initialization
UPD: As you have added respective codes, let's visualize what is happening here. Look at the picture bellow,
What happening:
- Your main package start initialing. But it is has imported auth package. So to complete initialization, auth package must be initialized.
auth package start initializing. But it has imported config package. So to complete initialization, config package must be initialized.
config package complete initialization(log.SetReportCaller(true)
is called).
auth package complete initialization.
main package complete initialization.main()
function starts executing...
@peterSO thank you for pointing me there. I have updated my answer to include this information.
– Emruz Hossain
2 days ago
I have added all the dependent code. Kindly refer the edited question and throw me some light on how dependency is working here.
– Aditya C S
yesterday
@AdityaCS I have updated my answer to explain what is happening.
– Emruz Hossain
yesterday
thanks for the explanation. Still my doubt is, is the "log" package imported and referenced in main.go the same as "log" imported and referenced in config.go. Both imports has different "log" reference right? How it still works?
– Aditya C S
yesterday
1
@Adrian has already answer this in his answer. "SetReportCaller
sets a global variable in github.com/sirupsen/logrus" . All imports from different packages refers to same instance until you create new one usinglogrus.New()
– Emruz Hossain
yesterday
add a comment |
up vote
3
down vote
accepted
Check this diagram to understand how init()
work: diagram
Initialization order are as follows,
If a package imports other packages, the imported packages are initialised first.
Package level variables are initialised then.
init function of current package is called next. A package can have multiple init functions (either in a single file or distributed across multiple files) and they are called in the order in which they are presented to the compiler.
You will found an example explaining this here.
I am suspecting in dependency tree, there is a common ancestor file that import both config
package and auth
package.
Here is official doc on initialization: Package initialization
UPD: As you have added respective codes, let's visualize what is happening here. Look at the picture bellow,
What happening:
- Your main package start initialing. But it is has imported auth package. So to complete initialization, auth package must be initialized.
auth package start initializing. But it has imported config package. So to complete initialization, config package must be initialized.
config package complete initialization(log.SetReportCaller(true)
is called).
auth package complete initialization.
main package complete initialization.main()
function starts executing...
@peterSO thank you for pointing me there. I have updated my answer to include this information.
– Emruz Hossain
2 days ago
I have added all the dependent code. Kindly refer the edited question and throw me some light on how dependency is working here.
– Aditya C S
yesterday
@AdityaCS I have updated my answer to explain what is happening.
– Emruz Hossain
yesterday
thanks for the explanation. Still my doubt is, is the "log" package imported and referenced in main.go the same as "log" imported and referenced in config.go. Both imports has different "log" reference right? How it still works?
– Aditya C S
yesterday
1
@Adrian has already answer this in his answer. "SetReportCaller
sets a global variable in github.com/sirupsen/logrus" . All imports from different packages refers to same instance until you create new one usinglogrus.New()
– Emruz Hossain
yesterday
add a comment |
up vote
3
down vote
accepted
up vote
3
down vote
accepted
Check this diagram to understand how init()
work: diagram
Initialization order are as follows,
If a package imports other packages, the imported packages are initialised first.
Package level variables are initialised then.
init function of current package is called next. A package can have multiple init functions (either in a single file or distributed across multiple files) and they are called in the order in which they are presented to the compiler.
You will found an example explaining this here.
I am suspecting in dependency tree, there is a common ancestor file that import both config
package and auth
package.
Here is official doc on initialization: Package initialization
UPD: As you have added respective codes, let's visualize what is happening here. Look at the picture bellow,
What happening:
- Your main package start initialing. But it is has imported auth package. So to complete initialization, auth package must be initialized.
auth package start initializing. But it has imported config package. So to complete initialization, config package must be initialized.
config package complete initialization(log.SetReportCaller(true)
is called).
auth package complete initialization.
main package complete initialization.main()
function starts executing...
Check this diagram to understand how init()
work: diagram
Initialization order are as follows,
If a package imports other packages, the imported packages are initialised first.
Package level variables are initialised then.
init function of current package is called next. A package can have multiple init functions (either in a single file or distributed across multiple files) and they are called in the order in which they are presented to the compiler.
You will found an example explaining this here.
I am suspecting in dependency tree, there is a common ancestor file that import both config
package and auth
package.
Here is official doc on initialization: Package initialization
UPD: As you have added respective codes, let's visualize what is happening here. Look at the picture bellow,
What happening:
- Your main package start initialing. But it is has imported auth package. So to complete initialization, auth package must be initialized.
auth package start initializing. But it has imported config package. So to complete initialization, config package must be initialized.
config package complete initialization(log.SetReportCaller(true)
is called).
auth package complete initialization.
main package complete initialization.main()
function starts executing...
edited yesterday
answered 2 days ago
Emruz Hossain
55316
55316
@peterSO thank you for pointing me there. I have updated my answer to include this information.
– Emruz Hossain
2 days ago
I have added all the dependent code. Kindly refer the edited question and throw me some light on how dependency is working here.
– Aditya C S
yesterday
@AdityaCS I have updated my answer to explain what is happening.
– Emruz Hossain
yesterday
thanks for the explanation. Still my doubt is, is the "log" package imported and referenced in main.go the same as "log" imported and referenced in config.go. Both imports has different "log" reference right? How it still works?
– Aditya C S
yesterday
1
@Adrian has already answer this in his answer. "SetReportCaller
sets a global variable in github.com/sirupsen/logrus" . All imports from different packages refers to same instance until you create new one usinglogrus.New()
– Emruz Hossain
yesterday
add a comment |
@peterSO thank you for pointing me there. I have updated my answer to include this information.
– Emruz Hossain
2 days ago
I have added all the dependent code. Kindly refer the edited question and throw me some light on how dependency is working here.
– Aditya C S
yesterday
@AdityaCS I have updated my answer to explain what is happening.
– Emruz Hossain
yesterday
thanks for the explanation. Still my doubt is, is the "log" package imported and referenced in main.go the same as "log" imported and referenced in config.go. Both imports has different "log" reference right? How it still works?
– Aditya C S
yesterday
1
@Adrian has already answer this in his answer. "SetReportCaller
sets a global variable in github.com/sirupsen/logrus" . All imports from different packages refers to same instance until you create new one usinglogrus.New()
– Emruz Hossain
yesterday
@peterSO thank you for pointing me there. I have updated my answer to include this information.
– Emruz Hossain
2 days ago
@peterSO thank you for pointing me there. I have updated my answer to include this information.
– Emruz Hossain
2 days ago
I have added all the dependent code. Kindly refer the edited question and throw me some light on how dependency is working here.
– Aditya C S
yesterday
I have added all the dependent code. Kindly refer the edited question and throw me some light on how dependency is working here.
– Aditya C S
yesterday
@AdityaCS I have updated my answer to explain what is happening.
– Emruz Hossain
yesterday
@AdityaCS I have updated my answer to explain what is happening.
– Emruz Hossain
yesterday
thanks for the explanation. Still my doubt is, is the "log" package imported and referenced in main.go the same as "log" imported and referenced in config.go. Both imports has different "log" reference right? How it still works?
– Aditya C S
yesterday
thanks for the explanation. Still my doubt is, is the "log" package imported and referenced in main.go the same as "log" imported and referenced in config.go. Both imports has different "log" reference right? How it still works?
– Aditya C S
yesterday
1
1
@Adrian has already answer this in his answer. "
SetReportCaller
sets a global variable in github.com/sirupsen/logrus" . All imports from different packages refers to same instance until you create new one using logrus.New()
– Emruz Hossain
yesterday
@Adrian has already answer this in his answer. "
SetReportCaller
sets a global variable in github.com/sirupsen/logrus" . All imports from different packages refers to same instance until you create new one using logrus.New()
– Emruz Hossain
yesterday
add a comment |
up vote
1
down vote
The behavior you're asking about actually has nothing to do with how init()
functions work. SetReportCaller
sets a global variable in github.com/sirupsen/logrus
, not in your config
or auth
packages. So it doesn't matter where you call that function or where you call log.Info
et al; the setting affects all calls to logrus regardless of call origin.
add a comment |
up vote
1
down vote
The behavior you're asking about actually has nothing to do with how init()
functions work. SetReportCaller
sets a global variable in github.com/sirupsen/logrus
, not in your config
or auth
packages. So it doesn't matter where you call that function or where you call log.Info
et al; the setting affects all calls to logrus regardless of call origin.
add a comment |
up vote
1
down vote
up vote
1
down vote
The behavior you're asking about actually has nothing to do with how init()
functions work. SetReportCaller
sets a global variable in github.com/sirupsen/logrus
, not in your config
or auth
packages. So it doesn't matter where you call that function or where you call log.Info
et al; the setting affects all calls to logrus regardless of call origin.
The behavior you're asking about actually has nothing to do with how init()
functions work. SetReportCaller
sets a global variable in github.com/sirupsen/logrus
, not in your config
or auth
packages. So it doesn't matter where you call that function or where you call log.Info
et al; the setting affects all calls to logrus regardless of call origin.
answered 2 days ago
Adrian
16.9k33446
16.9k33446
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53224684%2fhow-golangs-init-works-i-am-confused%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
can you show the file where your
main
function is. I am suspecting that file importsconfig
package.– Emruz Hossain
2 days ago
question is updated with main.go code
– Aditya C S
2 days ago
2
We can't see the dependency tree so I'm guessing
config
is a dependency somewhere here. if that is the case, it is not mystery why theinit()
function is called.– ssemilla
2 days ago