为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在 init() 中检查 nil

为什么在 init() 中检查 nil

Go
明月笑刀无情 2021-11-01 14:13:55
我正在阅读这篇文章,该文章在其示例中提供了此代码:var templates map[string]*template.Template// Load templates on program initialisationfunc init() {    if templates == nil {        templates = make(map[string]*template.Template)    }为什么要检查if templates == nil的init()?在执行的这一点上它不会总是相同的吗?
查看完整描述

2 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

没有理由在文章提供的代码中检查 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初始化的位置。


查看完整回答
反对 回复 2021-11-01
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

变量也可以使用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

}

程序应该有零错误。防御性编程。


查看完整回答
反对 回复 2021-11-01
  • 2 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信