Go语言map of sets初始化报assignment to entry in nil map问题
错误原因分析
这个报错是两个Go语法特性共同导致的:
- 变量作用域问题:Line函数匹配食谱开头行的if代码块中,使用了
currentRecipe := line[2:]短变量声明,这里创建的是if代码块内的局部同名变量,仅在当前if块内有效,完全没有修改Line函数入参里的currentRecipe值。出了if块后,Line函数作用域下的currentRecipe还是初始的空字符串。 - 值传递特性问题:Go语言的字符串是值类型,
main函数调用Line时是将currentRecipe的值拷贝传入,就算在Line函数内正确修改了入参currentRecipe的值,也不会同步更新main函数中存储的当前食谱名,下一次调用Line时传入的还是旧值。
开发者在标记(1)的位置确实完成了子map初始化,但初始化的是if块内局部变量对应的食谱名的key;当代码执行到标记(2)的食材行逻辑时,currentRecipe为空字符串,total映射中从未初始化过空字符串对应的子map,直接对tot[""][nutri]赋值就会触发assignment to entry in nil map错误。
快速修复方案
你可以任选一种方式修改:
- 将
currentRecipe改为指针类型传递,同时避免短变量声明覆盖外层变量:把Line函数的入参改为currentRecipe *string,if块内修改为*currentRecipe = line[2:],main函数调用时传入¤tRecipe - 调整
Line函数的返回值,每次调用后将当前食谱名返回给main函数更新变量
内容的提问来源于stack exchange,提问作者ymudyruc
相关产品推荐
相关产品推荐

