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

问题描述 投票:12回答:2

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

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

go naming internal
2个回答
19
投票

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

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

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


9
投票

您还可以看到在init中使用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本身由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?”中有说明

© www.soinside.com 2019 - 2024. All rights reserved.