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

集合初始化映射(转围)

集合初始化映射(转围)

Go
千巷猫影 2022-09-26 15:46:04
下面的Gorang代码根据以下形式的输入为每个食谱收集了一组营养:# applepie- flour- apple- egg# pizza- flour- cheese- egg- tomato它在 (2) 中抱怨。assignment to entry in nil map但是为什么?然而,每个“子映射”都初始化为 at (1) ?makepackage mainimport (    "bufio"    "fmt"    "os"    "regexp")func main() {    nutriments := map[string][]string{            "flour":{"sugars"},            "egg":{"protein", "fat"},            "tomato":{"water", "viamins"},            "cheese":{"calcium", "protein"},            "apple":{"sugars", "fiber", "vitamin"} }    total := make(map[string]map[string]bool)    f := bufio.NewScanner(os.Stdin)    currentRecipe := ""    for f.Scan() {            Line(f.Text(), currentRecipe, nutriments, total)    }    fmt.Println(total)}func Line (line, currentRecipe string, nut map[string][]string, tot map[string]map[string]bool) {    if foundrec, _ := regexp.MatchString("^# [[:graph:]]+", line); foundrec { // Begin recipe            currentRecipe := line[2:]            fmt.Println("---------", currentRecipe) // update current            tot[currentRecipe] = make(map[string]bool) // <== INITIALIZE SET (1)    }    if foundnut, _ := regexp.MatchString("^- [[:graph:]]+", line); foundnut { // New ingredient            nutri := line[2:]            tot[currentRecipe][nutri] = true   // <===== HERE (2)    }}
查看完整描述

1 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

正如评论所指出的,问题在于当前Recipe的更新机制。字符串按值传递。


这是正确的代码


package main


import (

    "bufio"

    "fmt"

    "os"

    "regexp"

)


func main() {

    nutriments := map[string][]string{

            "flour":{"sugars"},

            "egg":{"protein", "fat"},

            "tomato":{"water", "viamins"},

            "cheese":{"calcium", "protein"},

            "apple":{"sugars", "fiber", "vitamin"} }

    total := make(map[string]map[string]bool)

    f := bufio.NewScanner(os.Stdin)

    currentRecipe := ""

    for f.Scan() {

            currentRecipe = Line(f.Text(), currentRecipe, nutriments, total)

    }

    fmt.Println(total)

}


func Line (line, currentRecipe string, nut map[string][]string, tot map[string]map[string]bool) string {

    if foundrec, _ := regexp.MatchString("^# [[:graph:]]+", line); foundrec { // Begin recipe

            currentRecipe = line[2:]

            fmt.Println("---------", currentRecipe) // update current

            tot[currentRecipe] = make(map[string]bool) // prepare set

    }

    if foundnut, _ := regexp.MatchString("^- [[:graph:]]+", line); foundnut { // Begin ingredients list

            nutri := line[2:]

            tot[currentRecipe][nutri] = true

    }

    return currentRecipe

}


查看完整回答
反对 回复 2022-09-26
  • 1 回答
  • 0 关注
  • 66 浏览
慕课专栏
更多

添加回答

举报

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