2014-09-06 18 views
7

Così, oggi mentre stavo codificando ho scoperto che creare una funzione con il nome init generava un errore method init() not found, ma quando l'ho rinominato in startup tutto funzionava bene.Perché non puoi nominare una funzione in Go "init"?

La parola "init" è stata conservata per alcune operazioni interne in Go o am, mi manca qualcosa qui?

risposta

16

Sì, la funzione init() è speciale. Viene eseguito automaticamente quando viene caricato un pacchetto. Anche il pacchetto main può contenere uno o più init() funzioni che vengono eseguiti prima che il programma attuale inizia: http://golang.org/doc/effective_go.html#init

Fa parte della inizializzazione pacchetto, come spiegato nella specifica lingua: http://golang.org/ref/spec#Package_initialization

È comunemente usato per inizializzare le variabili package, ecc

+4

Si noti che è possibile denominare una funzione su un init struct e si può chiamare. – OneOfOne

8

È anche possibile vedere i diversi errori che si possono ottenere quando si utilizza 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 stesso è gestito da golang/cmd/gc/init.c:

/* 
* 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". 
*/ 

Il suo utilizzo è illustrato in "When is the init() function in go (golang) run?"