你为什么不能在Go“init”中命名一个函数?

时间:2014-09-06 11:32:41

标签: go naming internal

所以,今天我在编码时发现创建名为init的函数会生成错误method init() not found,但当我将其重命名为startup时,一切正常。

单词" init"在Go中保留了一些内部操作,或者我在这里遗漏了什么?

2 个答案:

答案 0 :(得分:19)

是的,函数init()很特别。加载包时会自动执行。即使包main可能包含在实际程序开始之前执行的一个或多个init()函数:http://golang.org/doc/effective_go.html#init

它是包初始化的一部分,如语言规范中所述:http://golang.org/ref/spec#Package_initialization

它通常用于初始化包变量等。

答案 1 :(得分:9)

您还可以看到在golang/test/init.go

中使用init时可以获得的不同错误
// 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本身由golang/cmd/gc/init.c管理:
现在在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".
*/

其用法在" When is the init() function in go (golang) run?"

中说明