So, today while I was coding I found out that creating a function with the name init
generated an error method init() not found
, but when I renamed it to startup
it all worked fine.
Is the word "init" preserved for some internal operation in Go or am I'm missing something here?
Yes, the function init()
is special. It is automatically executed when a package is loaded. Even the package main
may contain one or more init()
functions that are executed before the actual program begins: http://golang.org/doc/effective_go.html#init
It is part of the package initialization, as explained in the language specification: http://golang.org/ref/spec#Package_initialization
It is commonly used to initialize package variables, etc.
You can also see the different errors you can get when using init
in golang/test/init.go
// Verify that erroneous use of init is detected.
// Does not compile.
package main
import "runtime"
func init() {
}
func main() {
init() // ERROR "undefined.*init"
runtime.init() // ERROR "unexported.*runtime\.init"
var _ = init // ERROR "undefined.*init"
}
init
itself is managed by golang/cmd/gc/init.c
:
Now in cmd/compile/internal/gc/init.go
:
/*
* a function named init is a special case.
* it is called by the initialization before
* main is run. to make it unique within a
* package and also uncallable, the name,
* normally "pkg.init", is altered to "pkg.init·1".
*/
Its use is illustrated in "When is the init()
function in go (golang) run?"
来源:https://stackoverflow.com/questions/25699791/why-cant-you-name-a-function-in-go-init