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

Max*_*Max 12 naming internal go

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

是否为Go中的某些内部操作保留了"init"这个词,或者我在这里遗漏了什么?

sir*_*nga 19

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

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

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

  • 请注意,您可以在struct init上命名一个函数,然后可以调用它. (5认同)

Von*_*onC 9

您还可以看到不同的错误,你可以使用时,你得到initgolang/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"
}
Run Code Online (Sandbox Code Playgroud)

init本身由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".
*/
Run Code Online (Sandbox Code Playgroud)

它的用法在" go go(golang)中cmd/compile/internal/gc/init.go函数何时运行? "中有说明.