为什么在init()中检查nil

时间:2015-08-12 16:25:01

标签: go

我正在阅读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()?不知道在执行的这一点上总是一样的吗?

2 个答案:

答案 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

     

Package initialization

     

也可以使用名为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
}

程序应该没有错误。防守计划。