gpt4 book ai didi

variables - Go 初始化运算符,包范围变量 - 混淆 :

转载 作者:IT王子 更新时间:2023-10-29 00:45:37 26 4
gpt4 key购买 nike

以下代码工作正常 - 输出:You choose 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() 中的第一行,即 //nameMap = make(TNameMap) ,当 main() 运行,因为 nameMap 从未被初始化:

panic :运行时错误:分配给 nil 映射中的条目

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

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

我明白,如果我使用初始化运算符 - nameMap := make(TNameMap) - 我已经声明了一个新变量 nameMap ,它的范围仅限于 init() 函数,因此只有包级别变量 var nameMap TNameMapmain() 的范围内,导致没有输出,因为包级别var 不包含 map 数据。

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

最佳答案

根据 Go 规范:

A nil map is equivalent to an empty map except that no elements may be added.

这意味着您可以从 nil 映射中读取,但不能写入。就像 panic 说“assignment to entry in nil map”。如果您只注释掉 nameMap = make(TNameMap) 行,它将崩溃,因为您试图在 init 中写入它(这是发生 panic 的地方)。如果您注释掉整个 init,Println 将不会崩溃,因为您被允许访问(读取)一个 nil 映射。

将赋值更改为声明只是掩盖了这里的真正问题,正在发生的是它使所有赋值有效,然后丢弃结果。只要您使分配有效(通过删除它们或创建一个临时变量),您就会在 Println 中观察到相同的行为。

nil 映射返回的值始终是映射值类型的零值。所以 map[T]string 返回 ""map[T]int 返回 0,等等上。 (当然,如果您使用 val,ok := nilMap[key] 检查,那么 ok 将为 false)。

关于variables - Go 初始化运算符,包范围变量 - 混淆 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22291888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com