Go 初始化运算符,包作用域变量 - 困惑:

以下代码正常工作 - 输出: You chose Test 1


package main


import (

    "fmt"

)


type TNameMap map[int]string


var nameMap TNameMap


func init() {


    nameMap = make(TNameMap)

    nameMap[1] = "You chose Test 1"

    nameMap[2] = "You chose Test 2"

    nameMap[3] = "You chose Test 3"


}


func main() {


    fmt.Println(nameMap[1])


}

如果我注释掉init() ie 中 的第一行,运行//nameMap = make(TNameMap)时我会感到恐慌main(),因为nameMap从未初始化:


panic: runtime error: assignment to entry in nil map


但是- 如果init()我写nameMap := make(TNameMap)


而不是nameMap = make(TNameMap),我没有恐慌,也没有输出 -main()只是运行并终止进程。


我知道如果我使用 Initialization 运算符 - nameMap := make(TNameMap)我已经声明了一个nameMap仅作用域为init()函数的新变量,因此只有包级别变量 var nameMap TNameMap在 范围内main(),导致没有输出,因为包级别不var包含地图数据。


但是,我很困惑:为什么我panic在那种情况下没有得到?如果 main()正在对包 var 进行调用,则它从未被初始化 - 那么为什么不panic呢?


杨__羊羊
浏览 192回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go