1 回答
TA贡献1816条经验 获得超6个赞
问题是您正在每个调用中初始化“key”的嵌套映射,因此它始终覆盖以前的数据。
所以只需改变你的线路
retMap[key] = make(map[string]string) // If not assign here then it gives runtime error "panic: assignment to entry in nil map"
到下面应该使您的代码工作:
=_, ok := retMap[key]
if !ok {
retMap[key] = make(map[string]string)
}
我只是检查为“键”存储的值是否存在,如果不存在则初始化一个新映射。
更新:
我还重写了您的代码,以使用 Go 提供的一些内置函数,如strings.Split或strings.Trim*函数。它可能会有所帮助。
package main
import (
"fmt"
"strconv"
"strings"
)
const str = "Hello @John martin #sosos &Hi @William "
func main() {
retMap := make(map[string]map[string]string)
retMap["group"] = make(map[string]string)
retMap["user"] = make(map[string]string)
retMap["hashTag"] = make(map[string]string)
list := strings.Split(strings.TrimSpace(str), " ")
for _, value := range list {
firstCharacter := string(value[0])
if firstCharacter == "@" {
retMap["user"][strconv.Itoa(len(retMap["user"])+1)] = strings.TrimLeft(value, "@")
} else if firstCharacter == "&" {
retMap["group"][strconv.Itoa(len(retMap["group"])+1)] = strings.TrimLeft(value, "&")
} else if firstCharacter == "#" {
retMap["hashTag"][strconv.Itoa(len(retMap["hashTag"])+1)] = strings.TrimLeft(value, "#")
}
}
fmt.Println("Final String ", retMap)
}
- 1 回答
- 0 关注
- 141 浏览
添加回答
举报