为什么在 init() 中检查 nil

我正在阅读这篇文章,该文章在其示例中提供了此代码:


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()?在执行的这一点上它不会总是相同的吗?


明月笑刀无情
浏览 158回答 2
2回答

茅侃侃

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

MMMHUHU

变量也可以使用init 在包块中声明的函数进行初始化,没有参数和结果参数。func init() { … }即使在单个源文件中,也可以定义多个这样的函数。现在或将来可能会有多个init功能包。例如,package platesimport "text/template"var templates map[string]*template.Template// Load project templates on program initialisationfunc init() {    if templates == nil {        templates = make(map[string]*template.Template)    }    // Load project templates}// Load program templates on program initialisationfunc init() {    if templates == nil {        templates = make(map[string]*template.Template)    }    // Load program templates}程序应该有零错误。防御性编程。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go