13

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?

Dave C
  • 7,729
  • 4
  • 49
  • 65
Max
  • 792
  • 1
  • 8
  • 20

2 Answers2

19

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.

siritinga
  • 4,063
  • 25
  • 38
11

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?"

VonC
  • 1,262,500
  • 529
  • 4,410
  • 5,250