我正在阅读this article,在其示例中提供了此代码:
var templates map[string]*template.Template
// Load templates on program initialisation
func init() {
if templates == nil {
templates = make(map[string]*template.Template)
}
为什么要检查if templates == nil
中的init()
?不知道在执行的这一点上总是一样的吗?
答案 0 :(得分:6)
没有理由在文章中提供的代码中检查nil。还有其他方法来构造代码。
选项1:
var templates = map[string]*template.Template{}
func init() {
// code following the if statement from the function in the article
}
选项2:
var templates = initTemplates()
func initTemplates() map[string]*template.Template{} {
templates := map[string]*template.Template{}
// code following the if statement from the function in the article
return templates
}
选项3:
func init() {
templates = make(map[string]*template.Template)
// code following the if statement from the function in the article
}
您将在Go代码中看到所有这些方法。我更喜欢第二个选项,因为它清楚地表明templates
已在函数initTemplates
中初始化。其他选项需要一些环顾四周来找出templates
初始化的位置。
答案 1 :(得分:1)
The Go Programming Language Specification
也可以使用名为
init
的函数初始化变量 在包块中声明,没有参数,也没有结果 参数。func init() { … }
即使在单一来源中,也可以定义多个此类功能 文件。
现在或将来,软件包中可能有多个init
函数。例如,
package plates
import "text/template"
var templates map[string]*template.Template
// Load project templates on program initialisation
func init() {
if templates == nil {
templates = make(map[string]*template.Template)
}
// Load project templates
}
// Load program templates on program initialisation
func init() {
if templates == nil {
templates = make(map[string]*template.Template)
}
// Load program templates
}
程序应该没有错误。防守计划。